@memberjunction/server 5.40.2 → 5.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/dist/agentSessions/HostInstance.d.ts +19 -0
  2. package/dist/agentSessions/HostInstance.d.ts.map +1 -0
  3. package/dist/agentSessions/HostInstance.js +48 -0
  4. package/dist/agentSessions/HostInstance.js.map +1 -0
  5. package/dist/agentSessions/SessionJanitor.d.ts +97 -0
  6. package/dist/agentSessions/SessionJanitor.d.ts.map +1 -0
  7. package/dist/agentSessions/SessionJanitor.js +222 -0
  8. package/dist/agentSessions/SessionJanitor.js.map +1 -0
  9. package/dist/agentSessions/SessionManager.d.ts +142 -0
  10. package/dist/agentSessions/SessionManager.d.ts.map +1 -0
  11. package/dist/agentSessions/SessionManager.js +308 -0
  12. package/dist/agentSessions/SessionManager.js.map +1 -0
  13. package/dist/agentSessions/index.d.ts +4 -0
  14. package/dist/agentSessions/index.d.ts.map +1 -0
  15. package/dist/agentSessions/index.js +26 -0
  16. package/dist/agentSessions/index.js.map +1 -0
  17. package/dist/auth/initializeProviders.d.ts.map +1 -1
  18. package/dist/auth/initializeProviders.js +6 -1
  19. package/dist/auth/initializeProviders.js.map +1 -1
  20. package/dist/context.d.ts.map +1 -1
  21. package/dist/context.js +41 -7
  22. package/dist/context.js.map +1 -1
  23. package/dist/generated/generated.d.ts +659 -3
  24. package/dist/generated/generated.d.ts.map +1 -1
  25. package/dist/generated/generated.js +5459 -1759
  26. package/dist/generated/generated.js.map +1 -1
  27. package/dist/generic/ResolverBase.js +1 -1
  28. package/dist/generic/ResolverBase.js.map +1 -1
  29. package/dist/generic/RunViewResolver.js +9 -10
  30. package/dist/generic/RunViewResolver.js.map +1 -1
  31. package/dist/index.d.ts +4 -0
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +97 -41
  34. package/dist/index.js.map +1 -1
  35. package/dist/logging/StartupLogger.d.ts +121 -0
  36. package/dist/logging/StartupLogger.d.ts.map +1 -0
  37. package/dist/logging/StartupLogger.js +245 -0
  38. package/dist/logging/StartupLogger.js.map +1 -0
  39. package/dist/logging/variablesLoggingMiddleware.d.ts.map +1 -1
  40. package/dist/logging/variablesLoggingMiddleware.js +21 -2
  41. package/dist/logging/variablesLoggingMiddleware.js.map +1 -1
  42. package/dist/resolvers/AgentSessionResolver.d.ts +42 -0
  43. package/dist/resolvers/AgentSessionResolver.d.ts.map +1 -0
  44. package/dist/resolvers/AgentSessionResolver.js +152 -0
  45. package/dist/resolvers/AgentSessionResolver.js.map +1 -0
  46. package/dist/resolvers/EntityPermissionResolver.d.ts +16 -0
  47. package/dist/resolvers/EntityPermissionResolver.d.ts.map +1 -0
  48. package/dist/resolvers/EntityPermissionResolver.js +95 -0
  49. package/dist/resolvers/EntityPermissionResolver.js.map +1 -0
  50. package/dist/resolvers/RealtimeClientSessionResolver.d.ts +688 -0
  51. package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -0
  52. package/dist/resolvers/RealtimeClientSessionResolver.js +1774 -0
  53. package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -0
  54. package/dist/resolvers/RemoteBrowserActionResolver.d.ts +359 -0
  55. package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -0
  56. package/dist/resolvers/RemoteBrowserActionResolver.js +896 -0
  57. package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -0
  58. package/dist/services/ScheduledJobsService.d.ts.map +1 -1
  59. package/dist/services/ScheduledJobsService.js +6 -5
  60. package/dist/services/ScheduledJobsService.js.map +1 -1
  61. package/package.json +78 -74
  62. package/src/__tests__/RealtimeClientSessionResolver.test.ts +2605 -0
  63. package/src/__tests__/RemoteBrowserAudioStream.test.ts +174 -0
  64. package/src/__tests__/SessionJanitor.test.ts +234 -0
  65. package/src/__tests__/SessionManager.test.ts +465 -0
  66. package/src/__tests__/subscriptionRedaction.test.ts +5 -0
  67. package/src/agentSessions/HostInstance.ts +53 -0
  68. package/src/agentSessions/SessionJanitor.ts +267 -0
  69. package/src/agentSessions/SessionManager.ts +446 -0
  70. package/src/agentSessions/index.ts +27 -0
  71. package/src/auth/initializeProviders.ts +6 -1
  72. package/src/context.ts +42 -7
  73. package/src/generated/generated.ts +3111 -567
  74. package/src/generic/ResolverBase.ts +1 -1
  75. package/src/generic/RunViewResolver.ts +9 -9
  76. package/src/index.ts +98 -41
  77. package/src/logging/StartupLogger.ts +317 -0
  78. package/src/logging/variablesLoggingMiddleware.ts +25 -5
  79. package/src/resolvers/AgentSessionResolver.ts +138 -0
  80. package/src/resolvers/EntityPermissionResolver.ts +73 -0
  81. package/src/resolvers/RealtimeClientSessionResolver.ts +2162 -0
  82. package/src/resolvers/RemoteBrowserActionResolver.ts +907 -0
  83. package/src/services/ScheduledJobsService.ts +6 -5
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Server log verbosity levels, ordered from least to most chatty.
3
+ *
4
+ * Reuses the SAME enum shape as `telemetry.level` in `config.ts` so operators
5
+ * have a single knob (`telemetry.level` in mj.config.cjs) that governs both
6
+ * telemetry verbosity and server-log verbosity — there is no parallel setting.
7
+ *
8
+ * Ordering (ascending): `minimal` < `standard` < `verbose` < `debug`.
9
+ */
10
+ export type ServerLogLevel = 'minimal' | 'standard' | 'verbose' | 'debug';
11
+ /**
12
+ * MJServer-local startup + per-request log gating helper.
13
+ *
14
+ * Holds the resolved {@link ServerLogLevel} (from `telemetry.level`) and exposes
15
+ * a small surface for level-gated logging, startup phase-timing capture, and the
16
+ * compact summary block printed once at the end of boot.
17
+ *
18
+ * This is deliberately NOT a `BaseSingleton` and does NOT touch
19
+ * `@memberjunction/core` logging internals — it is a thin, process-local gate
20
+ * that wraps `console.*` / `LogStatus`. The point is the *gating*, not a new
21
+ * logging framework.
22
+ *
23
+ * Usage:
24
+ * ```ts
25
+ * const logger = new StartupLogger();
26
+ * logger.LogIf('verbose', 'Registered auth provider: azure');
27
+ * const t = logger.StartPhase();
28
+ * // ... work ...
29
+ * logger.EndPhase('DB Pool Connect', t);
30
+ * logger.PrintSummary();
31
+ * ```
32
+ */
33
+ export declare class StartupLogger {
34
+ private readonly resolvedLevel;
35
+ private readonly phaseTimings;
36
+ private readonly summary;
37
+ /**
38
+ * @param level Optional explicit level override (primarily for tests).
39
+ * When omitted, the level is resolved from config.
40
+ */
41
+ constructor(level?: ServerLogLevel);
42
+ /**
43
+ * The resolved log level in effect for this logger instance.
44
+ */
45
+ get Level(): ServerLogLevel;
46
+ /**
47
+ * Resolves the active server log level from configuration.
48
+ *
49
+ * Source of truth is `telemetry.level` (the pre-existing enum), so a single
50
+ * operator knob governs both telemetry and server logging. Defaults to
51
+ * `standard` when unset or unrecognized.
52
+ */
53
+ static resolveLevelFromConfig(): ServerLogLevel;
54
+ /**
55
+ * True when the active level is at least `minLevel` (using the ascending
56
+ * `minimal < standard < verbose < debug` ordering).
57
+ */
58
+ IsAtLeast(minLevel: ServerLogLevel): boolean;
59
+ /**
60
+ * Logs `message` only when the active level is at least `minLevel`.
61
+ * Routes through MJ's `LogStatus` so the line participates in MJ's
62
+ * standard status-logging pipeline.
63
+ */
64
+ LogIf(minLevel: ServerLogLevel, message: string): void;
65
+ /**
66
+ * Starts a phase timer. Returns an opaque start timestamp to pass to
67
+ * {@link EndPhase}.
68
+ */
69
+ StartPhase(): number;
70
+ /**
71
+ * Records the elapsed time for a phase since `startedAt`, buffering it for the
72
+ * summary. At `verbose`+ the phase is also printed immediately (matching the
73
+ * legacy `⏱️ [Startup] X: Yms` lines); at `standard` it is collapsed into the
74
+ * one-line `Startup` summary printed by {@link PrintSummary}.
75
+ *
76
+ * @returns A fresh timestamp, so callers can chain phases ergonomically.
77
+ */
78
+ EndPhase(label: string, startedAt: number): number;
79
+ /** Records the server package version for the summary header. */
80
+ SetVersion(version: string | undefined): void;
81
+ /** Records DB platform + connection + entity count for the summary `DB` line. */
82
+ SetDatabaseInfo(platform: string, connection: string, entityCount: number): void;
83
+ /** Adds a registered auth-provider name to the summary `Auth` line. */
84
+ AddAuthProvider(name: string): void;
85
+ /** Records whether the REST API is enabled for the summary `Auth` line. */
86
+ SetRestEnabled(enabled: boolean): void;
87
+ /** Records the active scheduled-job count for the summary `Auth` line. */
88
+ SetScheduledJobCount(count: number): void;
89
+ /** Records the ready URL for the summary `Ready` line. */
90
+ SetReadyUrl(url: string): void;
91
+ /**
92
+ * Prints the boot summary appropriate for the active level:
93
+ * - `minimal`: only the `Ready <url>` line.
94
+ * - `standard`: the compact ~8-line summary block (with phases collapsed).
95
+ * - `verbose`/`debug`: the same compact block (individual phase lines and
96
+ * all detail lines were already printed inline during boot).
97
+ */
98
+ PrintSummary(): void;
99
+ /** Prints just the ready URL (minimal level). */
100
+ private printReadyLineOnly;
101
+ /** Renders and prints the multi-line compact summary block. */
102
+ private printSummaryBlock;
103
+ /** Builds the array of summary lines (header + indented detail rows). */
104
+ private buildSummaryLines;
105
+ /** `🚀 MemberJunction Server · v<version>` (version omitted if unknown). */
106
+ private buildHeaderLine;
107
+ /** ` DB <platform> · <connection> · <N> entities`. */
108
+ private buildDbLine;
109
+ /** ` Auth <providers> REST <on/off> · <N> scheduled jobs`. */
110
+ private buildAuthLine;
111
+ /** ` Startup <total>s (<phase> <x>s · <phase> <y>s …)`. */
112
+ private buildStartupLine;
113
+ /**
114
+ * Abbreviates a verbose phase label into a compact token for the collapsed
115
+ * summary line (e.g. "Metadata + Provider Setup" → "metadata").
116
+ */
117
+ private shortPhaseLabel;
118
+ /** ` Ready <url>`. */
119
+ private buildReadyLine;
120
+ }
121
+ //# sourceMappingURL=StartupLogger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StartupLogger.d.ts","sourceRoot":"","sources":["../../src/logging/StartupLogger.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AACH,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;AA8C1E;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAiB;IAC/C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6C;IAErE;;;OAGG;gBACS,KAAK,CAAC,EAAE,cAAc;IAIlC;;OAEG;IACH,IAAW,KAAK,IAAI,cAAc,CAEjC;IAED;;;;;;OAMG;WACW,sBAAsB,IAAI,cAAc;IAQtD;;;OAGG;IACI,SAAS,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO;IAInD;;;;OAIG;IACI,KAAK,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAM7D;;;OAGG;IACI,UAAU,IAAI,MAAM;IAI3B;;;;;;;OAOG;IACI,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAUzD,iEAAiE;IAC1D,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAIpD,iFAAiF;IAC1E,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAMvF,uEAAuE;IAChE,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI1C,2EAA2E;IACpE,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI7C,0EAA0E;IACnE,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIhD,0DAA0D;IACnD,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIrC;;;;;;OAMG;IACI,YAAY,IAAI,IAAI;IAQ3B,iDAAiD;IACjD,OAAO,CAAC,kBAAkB;IAO1B,+DAA+D;IAC/D,OAAO,CAAC,iBAAiB;IAMzB,yEAAyE;IACzE,OAAO,CAAC,iBAAiB;IAUzB,8EAA8E;IAC9E,OAAO,CAAC,eAAe;IAKvB,+DAA+D;IAC/D,OAAO,CAAC,WAAW;IAcnB,8EAA8E;IAC9E,OAAO,CAAC,aAAa;IAerB,gEAAgE;IAChE,OAAO,CAAC,gBAAgB;IAWxB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAuBvB,4BAA4B;IAC5B,OAAO,CAAC,cAAc;CAMvB"}
@@ -0,0 +1,245 @@
1
+ import { configInfo } from '../config.js';
2
+ import { LogStatus } from '@memberjunction/core';
3
+ /** Numeric rank for each level, used for `>=` threshold comparisons. */
4
+ const LEVEL_RANK = {
5
+ minimal: 0,
6
+ standard: 1,
7
+ verbose: 2,
8
+ debug: 3,
9
+ };
10
+ /**
11
+ * MJServer-local startup + per-request log gating helper.
12
+ *
13
+ * Holds the resolved {@link ServerLogLevel} (from `telemetry.level`) and exposes
14
+ * a small surface for level-gated logging, startup phase-timing capture, and the
15
+ * compact summary block printed once at the end of boot.
16
+ *
17
+ * This is deliberately NOT a `BaseSingleton` and does NOT touch
18
+ * `@memberjunction/core` logging internals — it is a thin, process-local gate
19
+ * that wraps `console.*` / `LogStatus`. The point is the *gating*, not a new
20
+ * logging framework.
21
+ *
22
+ * Usage:
23
+ * ```ts
24
+ * const logger = new StartupLogger();
25
+ * logger.LogIf('verbose', 'Registered auth provider: azure');
26
+ * const t = logger.StartPhase();
27
+ * // ... work ...
28
+ * logger.EndPhase('DB Pool Connect', t);
29
+ * logger.PrintSummary();
30
+ * ```
31
+ */
32
+ export class StartupLogger {
33
+ /**
34
+ * @param level Optional explicit level override (primarily for tests).
35
+ * When omitted, the level is resolved from config.
36
+ */
37
+ constructor(level) {
38
+ this.phaseTimings = [];
39
+ this.summary = { AuthProviders: [] };
40
+ this.resolvedLevel = level ?? StartupLogger.resolveLevelFromConfig();
41
+ }
42
+ /**
43
+ * The resolved log level in effect for this logger instance.
44
+ */
45
+ get Level() {
46
+ return this.resolvedLevel;
47
+ }
48
+ /**
49
+ * Resolves the active server log level from configuration.
50
+ *
51
+ * Source of truth is `telemetry.level` (the pre-existing enum), so a single
52
+ * operator knob governs both telemetry and server logging. Defaults to
53
+ * `standard` when unset or unrecognized.
54
+ */
55
+ static resolveLevelFromConfig() {
56
+ const raw = configInfo.telemetry?.level;
57
+ if (raw === 'minimal' || raw === 'standard' || raw === 'verbose' || raw === 'debug') {
58
+ return raw;
59
+ }
60
+ return 'standard';
61
+ }
62
+ /**
63
+ * True when the active level is at least `minLevel` (using the ascending
64
+ * `minimal < standard < verbose < debug` ordering).
65
+ */
66
+ IsAtLeast(minLevel) {
67
+ return LEVEL_RANK[this.resolvedLevel] >= LEVEL_RANK[minLevel];
68
+ }
69
+ /**
70
+ * Logs `message` only when the active level is at least `minLevel`.
71
+ * Routes through MJ's `LogStatus` so the line participates in MJ's
72
+ * standard status-logging pipeline.
73
+ */
74
+ LogIf(minLevel, message) {
75
+ if (this.IsAtLeast(minLevel)) {
76
+ LogStatus(message);
77
+ }
78
+ }
79
+ /**
80
+ * Starts a phase timer. Returns an opaque start timestamp to pass to
81
+ * {@link EndPhase}.
82
+ */
83
+ StartPhase() {
84
+ return performance.now();
85
+ }
86
+ /**
87
+ * Records the elapsed time for a phase since `startedAt`, buffering it for the
88
+ * summary. At `verbose`+ the phase is also printed immediately (matching the
89
+ * legacy `⏱️ [Startup] X: Yms` lines); at `standard` it is collapsed into the
90
+ * one-line `Startup` summary printed by {@link PrintSummary}.
91
+ *
92
+ * @returns A fresh timestamp, so callers can chain phases ergonomically.
93
+ */
94
+ EndPhase(label, startedAt) {
95
+ const ms = performance.now() - startedAt;
96
+ this.phaseTimings.push({ Label: label, Ms: ms });
97
+ if (this.IsAtLeast('verbose')) {
98
+ // eslint-disable-next-line no-console
99
+ console.log(`⏱️ [Startup] ${label}: ${ms.toFixed(0)}ms`);
100
+ }
101
+ return performance.now();
102
+ }
103
+ /** Records the server package version for the summary header. */
104
+ SetVersion(version) {
105
+ this.summary.Version = version;
106
+ }
107
+ /** Records DB platform + connection + entity count for the summary `DB` line. */
108
+ SetDatabaseInfo(platform, connection, entityCount) {
109
+ this.summary.DbPlatform = platform;
110
+ this.summary.DbConnection = connection;
111
+ this.summary.EntityCount = entityCount;
112
+ }
113
+ /** Adds a registered auth-provider name to the summary `Auth` line. */
114
+ AddAuthProvider(name) {
115
+ this.summary.AuthProviders.push(name);
116
+ }
117
+ /** Records whether the REST API is enabled for the summary `Auth` line. */
118
+ SetRestEnabled(enabled) {
119
+ this.summary.RestEnabled = enabled;
120
+ }
121
+ /** Records the active scheduled-job count for the summary `Auth` line. */
122
+ SetScheduledJobCount(count) {
123
+ this.summary.ScheduledJobCount = count;
124
+ }
125
+ /** Records the ready URL for the summary `Ready` line. */
126
+ SetReadyUrl(url) {
127
+ this.summary.ReadyUrl = url;
128
+ }
129
+ /**
130
+ * Prints the boot summary appropriate for the active level:
131
+ * - `minimal`: only the `Ready <url>` line.
132
+ * - `standard`: the compact ~8-line summary block (with phases collapsed).
133
+ * - `verbose`/`debug`: the same compact block (individual phase lines and
134
+ * all detail lines were already printed inline during boot).
135
+ */
136
+ PrintSummary() {
137
+ if (this.resolvedLevel === 'minimal') {
138
+ this.printReadyLineOnly();
139
+ return;
140
+ }
141
+ this.printSummaryBlock();
142
+ }
143
+ /** Prints just the ready URL (minimal level). */
144
+ printReadyLineOnly() {
145
+ if (this.summary.ReadyUrl) {
146
+ // eslint-disable-next-line no-console
147
+ console.log(`🚀 Ready ${this.summary.ReadyUrl}`);
148
+ }
149
+ }
150
+ /** Renders and prints the multi-line compact summary block. */
151
+ printSummaryBlock() {
152
+ const lines = this.buildSummaryLines();
153
+ // eslint-disable-next-line no-console
154
+ console.log('\n' + lines.join('\n') + '\n');
155
+ }
156
+ /** Builds the array of summary lines (header + indented detail rows). */
157
+ buildSummaryLines() {
158
+ const lines = [];
159
+ lines.push(this.buildHeaderLine());
160
+ lines.push(this.buildDbLine());
161
+ lines.push(this.buildAuthLine());
162
+ lines.push(this.buildStartupLine());
163
+ lines.push(this.buildReadyLine());
164
+ return lines.filter((l) => l.length > 0);
165
+ }
166
+ /** `🚀 MemberJunction Server · v<version>` (version omitted if unknown). */
167
+ buildHeaderLine() {
168
+ const version = this.summary.Version ? ` · v${this.summary.Version}` : '';
169
+ return `🚀 MemberJunction Server${version}`;
170
+ }
171
+ /** ` DB <platform> · <connection> · <N> entities`. */
172
+ buildDbLine() {
173
+ if (!this.summary.DbPlatform) {
174
+ return '';
175
+ }
176
+ const parts = [this.summary.DbPlatform];
177
+ if (this.summary.DbConnection) {
178
+ parts.push(this.summary.DbConnection);
179
+ }
180
+ if (this.summary.EntityCount != null) {
181
+ parts.push(`${this.summary.EntityCount} entities`);
182
+ }
183
+ return ` DB ${parts.join(' · ')}`;
184
+ }
185
+ /** ` Auth <providers> REST <on/off> · <N> scheduled jobs`. */
186
+ buildAuthLine() {
187
+ const providers = this.summary.AuthProviders.length > 0
188
+ ? this.summary.AuthProviders.join(', ')
189
+ : 'none';
190
+ const rest = this.summary.RestEnabled == null
191
+ ? ''
192
+ : `REST ${this.summary.RestEnabled ? 'on' : 'off'}`;
193
+ const jobs = this.summary.ScheduledJobCount == null
194
+ ? ''
195
+ : `${this.summary.ScheduledJobCount} scheduled jobs`;
196
+ const trailer = [rest, jobs].filter((s) => s.length > 0).join(' · ');
197
+ const trailerPart = trailer ? ` ${trailer}` : '';
198
+ return ` Auth ${providers}${trailerPart}`;
199
+ }
200
+ /** ` Startup <total>s (<phase> <x>s · <phase> <y>s …)`. */
201
+ buildStartupLine() {
202
+ if (this.phaseTimings.length === 0) {
203
+ return '';
204
+ }
205
+ const totalMs = this.phaseTimings.reduce((sum, p) => sum + p.Ms, 0);
206
+ const phaseParts = this.phaseTimings
207
+ .map((p) => `${this.shortPhaseLabel(p.Label)} ${(p.Ms / 1000).toFixed(1)}s`)
208
+ .join(' · ');
209
+ return ` Startup ${(totalMs / 1000).toFixed(1)}s (${phaseParts})`;
210
+ }
211
+ /**
212
+ * Abbreviates a verbose phase label into a compact token for the collapsed
213
+ * summary line (e.g. "Metadata + Provider Setup" → "metadata").
214
+ */
215
+ shortPhaseLabel(label) {
216
+ const lower = label.toLowerCase();
217
+ if (lower.includes('metadata') || lower.includes('provider')) {
218
+ return 'metadata';
219
+ }
220
+ if (lower.includes('schema')) {
221
+ return 'schema';
222
+ }
223
+ if (lower.includes('db') || lower.includes('pool')) {
224
+ return 'db';
225
+ }
226
+ if (lower.includes('resolver') || lower.includes('middleware')) {
227
+ return 'resolvers';
228
+ }
229
+ if (lower.includes('apollo') || lower.includes('express')) {
230
+ return 'http';
231
+ }
232
+ if (lower.includes('telemetry') || lower.includes('cache')) {
233
+ return 'cache';
234
+ }
235
+ return lower.split(' ')[0];
236
+ }
237
+ /** ` Ready <url>`. */
238
+ buildReadyLine() {
239
+ if (!this.summary.ReadyUrl) {
240
+ return '';
241
+ }
242
+ return ` Ready ${this.summary.ReadyUrl}`;
243
+ }
244
+ }
245
+ //# sourceMappingURL=StartupLogger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StartupLogger.js","sourceRoot":"","sources":["../../src/logging/StartupLogger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAajD,wEAAwE;AACxE,MAAM,UAAU,GAAmC;IACjD,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE,CAAC;IACX,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,CAAC;CACT,CAAC;AAsCF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,aAAa;IAKxB;;;OAGG;IACH,YAAY,KAAsB;QAPjB,iBAAY,GAAkB,EAAE,CAAC;QACjC,YAAO,GAAuB,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;QAOnE,IAAI,CAAC,aAAa,GAAG,KAAK,IAAI,aAAa,CAAC,sBAAsB,EAAE,CAAC;IACvE,CAAC;IAED;;OAEG;IACH,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,sBAAsB;QAClC,MAAM,GAAG,GAAG,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC;QACxC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACpF,OAAO,GAAG,CAAC;QACb,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;;OAGG;IACI,SAAS,CAAC,QAAwB;QACvC,OAAO,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;IAChE,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,QAAwB,EAAE,OAAe;QACpD,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,SAAS,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;;OAGG;IACI,UAAU;QACf,OAAO,WAAW,CAAC,GAAG,EAAE,CAAC;IAC3B,CAAC;IAED;;;;;;;OAOG;IACI,QAAQ,CAAC,KAAa,EAAE,SAAiB;QAC9C,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACzC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACjD,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,KAAK,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,WAAW,CAAC,GAAG,EAAE,CAAC;IAC3B,CAAC;IAED,iEAAiE;IAC1D,UAAU,CAAC,OAA2B;QAC3C,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;IACjC,CAAC;IAED,iFAAiF;IAC1E,eAAe,CAAC,QAAgB,EAAE,UAAkB,EAAE,WAAmB;QAC9E,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,QAAQ,CAAC;QACnC,IAAI,CAAC,OAAO,CAAC,YAAY,GAAG,UAAU,CAAC;QACvC,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC;IACzC,CAAC;IAED,uEAAuE;IAChE,eAAe,CAAC,IAAY;QACjC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,2EAA2E;IACpE,cAAc,CAAC,OAAgB;QACpC,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC;IACrC,CAAC;IAED,0EAA0E;IACnE,oBAAoB,CAAC,KAAa;QACvC,IAAI,CAAC,OAAO,CAAC,iBAAiB,GAAG,KAAK,CAAC;IACzC,CAAC;IAED,0DAA0D;IACnD,WAAW,CAAC,GAAW;QAC5B,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAC;IAC9B,CAAC;IAED;;;;;;OAMG;IACI,YAAY;QACjB,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACrC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QACD,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAED,iDAAiD;IACzC,kBAAkB;QACxB,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC1B,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,+DAA+D;IACvD,iBAAiB;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvC,sCAAsC;QACtC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,yEAAyE;IACjE,iBAAiB;QACvB,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;QAClC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,8EAA8E;IACtE,eAAe;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,OAAO,2BAA2B,OAAO,EAAE,CAAC;IAC9C,CAAC;IAED,+DAA+D;IACvD,WAAW;QACjB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YAC7B,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACxC,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,WAAW,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,gBAAgB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;IAC7C,CAAC;IAED,8EAA8E;IACtE,aAAa;QACnB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;YACrD,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;YACvC,CAAC,CAAC,MAAM,CAAC;QACX,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,IAAI;YAC3C,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,IAAI,IAAI;YACjD,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,iBAAiB,CAAC;QACvD,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrE,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,OAAO,gBAAgB,SAAS,GAAG,WAAW,EAAE,CAAC;IACnD,CAAC;IAED,gEAAgE;IACxD,gBAAgB;QACtB,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACpE,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY;aACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;aAC3E,IAAI,CAAC,KAAK,CAAC,CAAC;QACf,OAAO,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,UAAU,GAAG,CAAC;IACzE,CAAC;IAED;;;OAGG;IACK,eAAe,CAAC,KAAa;QACnC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAClC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7D,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACnD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YAC/D,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1D,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3D,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,4BAA4B;IACpB,cAAc;QACpB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC3B,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,gBAAgB,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IACjD,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"variablesLoggingMiddleware.d.ts","sourceRoot":"","sources":["../../src/logging/variablesLoggingMiddleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAKjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA2E9C;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,0BAA0B,EAAE,YAAY,CAAC,UAAU,CAsE/D,CAAC"}
1
+ {"version":3,"file":"variablesLoggingMiddleware.d.ts","sourceRoot":"","sources":["../../src/logging/variablesLoggingMiddleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAKjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA2F9C;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,0BAA0B,EAAE,YAAY,CAAC,UAAU,CA0E/D,CAAC"}
@@ -3,6 +3,21 @@ import { getNamedType } from 'graphql';
3
3
  import { configInfo } from '../config.js';
4
4
  import { redactArg } from './secretRedactor.js';
5
5
  import { hasNoLogParameter, getNoLogFields } from './NoLog.js';
6
+ import { StartupLogger } from './StartupLogger.js';
7
+ /**
8
+ * Memoized "is the server log level `debug`?" check. The per-resolver
9
+ * variables echo is gated behind BOTH `logVariables` (opt-in redaction path)
10
+ * AND `level === 'debug'` — it is a raw, constantly-on debug line, so it should
11
+ * never fire unless an operator explicitly opted into debug verbosity. Config
12
+ * is immutable post-boot, so caching the resolution is safe.
13
+ */
14
+ let isDebugLevelCache;
15
+ function isDebugLogLevel() {
16
+ if (isDebugLevelCache === undefined) {
17
+ isDebugLevelCache = StartupLogger.resolveLevelFromConfig() === 'debug';
18
+ }
19
+ return isDebugLevelCache;
20
+ }
6
21
  let resolverLookup;
7
22
  function getResolverLookup() {
8
23
  if (resolverLookup !== undefined) {
@@ -94,8 +109,12 @@ export const variablesLoggingMiddleware = async (action, next) => {
94
109
  hasUndecoratedCustomArg = true;
95
110
  }
96
111
  }
97
- // eslint-disable-next-line no-console
98
- console.dir({ operation: action.info.fieldName, args: redactedArgs }, { depth: null, breakLength: 200 });
112
+ // Raw per-resolver variables echo — gated to debug-only so it never streams
113
+ // constantly even when an operator turns on logVariables at a lower level.
114
+ if (isDebugLogLevel()) {
115
+ // eslint-disable-next-line no-console
116
+ console.dir({ operation: action.info.fieldName, args: redactedArgs }, { depth: null, breakLength: 200 });
117
+ }
99
118
  if (hasUndecoratedCustomArg && resolverEntry) {
100
119
  const signature = `${resolverEntry.target.name}.${resolverEntry.methodName}`;
101
120
  if (!warnedResolverSignatures.has(signature)) {
@@ -1 +1 @@
1
- {"version":3,"file":"variablesLoggingMiddleware.js","sourceRoot":"","sources":["../../src/logging/variablesLoggingMiddleware.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"variablesLoggingMiddleware.js","sourceRoot":"","sources":["../../src/logging/variablesLoggingMiddleware.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { AppContext } from '../types.js';
2
+ import { ResolverBase } from '../generic/ResolverBase.js';
3
+ /** Result of {@link AgentSessionResolver.StartAgentSession}. */
4
+ export declare class StartAgentSessionResult {
5
+ /** ID of the newly created session. */
6
+ agentSessionId: string;
7
+ /** Lifecycle status of the session (always `Active` on a successful start). */
8
+ status: string;
9
+ /** ID of the conversation the session is attached to (supplied or freshly created). */
10
+ conversationId: string;
11
+ }
12
+ /**
13
+ * Resolver for the AI Agent Session record lifecycle. A single {@link SessionManager} instance is
14
+ * shared across requests — it holds no per-user/provider state (only heartbeat-coalescing
15
+ * timestamps), and every method is passed the request `contextUser` + provider explicitly.
16
+ */
17
+ export declare class AgentSessionResolver extends ResolverBase {
18
+ private readonly sessionManager;
19
+ /**
20
+ * Open a new session for an agent. Authorization (`CanRun`) is enforced inside
21
+ * {@link SessionManager.CreateSession}; a denial surfaces as a thrown error and no row is written.
22
+ */
23
+ StartAgentSession(agentId: string, { userPayload, providers }: AppContext, conversationId?: string, lastSessionId?: string, configJson?: string): Promise<StartAgentSessionResult>;
24
+ /**
25
+ * Close a session. Rejects unless the caller owns it. Returns `true` on a successful (or
26
+ * idempotent) close, `false` if the session can't be loaded.
27
+ */
28
+ CloseAgentSession(agentSessionId: string, { userPayload, providers }: AppContext): Promise<boolean>;
29
+ /**
30
+ * Record activity on a session (coalesced). Rejects unless the caller owns it. Returns `true`
31
+ * when the heartbeat was accepted (written or coalesced), `false` if the session is gone/closed.
32
+ */
33
+ AgentSessionHeartbeat(agentSessionId: string, { userPayload, providers }: AppContext): Promise<boolean>;
34
+ /** Resolve the request user + read-write provider, throwing a clear error if unauthenticated. */
35
+ private requireUserAndProvider;
36
+ /**
37
+ * Inbound ownership gate (the one genuinely new session-authz primitive): the session's `UserID`
38
+ * must equal the caller's. Throws on mismatch or when the session can't be loaded.
39
+ */
40
+ private assertOwnership;
41
+ }
42
+ //# sourceMappingURL=AgentSessionResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentSessionResolver.d.ts","sourceRoot":"","sources":["../../src/resolvers/AgentSessionResolver.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAI1D,gEAAgE;AAChE,qBACa,uBAAuB;IAChC,uCAAuC;IAEvC,cAAc,EAAE,MAAM,CAAC;IAEvB,+EAA+E;IAE/E,MAAM,EAAE,MAAM,CAAC;IAEf,uFAAuF;IAEvF,cAAc,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,qBACa,oBAAqB,SAAQ,YAAY;IAClD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwB;IAEvD;;;OAGG;IAEG,iBAAiB,CACH,OAAO,EAAE,MAAM,EACxB,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,UAAU,EACF,cAAc,CAAC,EAAE,MAAM,EACxB,aAAa,CAAC,EAAE,MAAM,EACzB,UAAU,CAAC,EAAE,MAAM,GAC3D,OAAO,CAAC,uBAAuB,CAAC;IAkBnC;;;OAGG;IAEG,iBAAiB,CACI,cAAc,EAAE,MAAM,EACtC,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,UAAU,GAC9C,OAAO,CAAC,OAAO,CAAC;IAMnB;;;OAGG;IAEG,qBAAqB,CACA,cAAc,EAAE,MAAM,EACtC,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,UAAU,GAC9C,OAAO,CAAC,OAAO,CAAC;IAQnB,iGAAiG;IACjG,OAAO,CAAC,sBAAsB;IAW9B;;;OAGG;YACW,eAAe;CAehC"}
@@ -0,0 +1,152 @@
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
+ /**
14
+ * @fileoverview GraphQL resolver for the AI Agent Session record lifecycle.
15
+ *
16
+ * Exposes start / close / heartbeat mutations over {@link SessionManager}, each running under the
17
+ * request's `contextUser` + request-scoped `IMetadataProvider`. Enforces two authorization gates:
18
+ * - **Open**: `CanRun` on the target agent (delegated to {@link SessionManager.CreateSession}).
19
+ * - **Close / Heartbeat**: inbound ownership — the session's `UserID` must equal `contextUser.ID`.
20
+ *
21
+ * The audio/media transport and the long-lived realtime run are out of scope here (P5); this
22
+ * resolver only manipulates the durable session record.
23
+ *
24
+ * @module @memberjunction/server
25
+ */
26
+ import { Resolver, Mutation, Arg, Ctx, ObjectType, Field } from 'type-graphql';
27
+ import { LogError } from '@memberjunction/core';
28
+ import { UUIDsEqual } from '@memberjunction/global';
29
+ import { ResolverBase } from '../generic/ResolverBase.js';
30
+ import { GetReadWriteProvider } from '../util.js';
31
+ import { SessionManager, SessionAuthorizationError } from '../agentSessions/index.js';
32
+ /** Result of {@link AgentSessionResolver.StartAgentSession}. */
33
+ let StartAgentSessionResult = class StartAgentSessionResult {
34
+ };
35
+ __decorate([
36
+ Field(),
37
+ __metadata("design:type", String)
38
+ ], StartAgentSessionResult.prototype, "agentSessionId", void 0);
39
+ __decorate([
40
+ Field(),
41
+ __metadata("design:type", String)
42
+ ], StartAgentSessionResult.prototype, "status", void 0);
43
+ __decorate([
44
+ Field(),
45
+ __metadata("design:type", String)
46
+ ], StartAgentSessionResult.prototype, "conversationId", void 0);
47
+ StartAgentSessionResult = __decorate([
48
+ ObjectType()
49
+ ], StartAgentSessionResult);
50
+ export { StartAgentSessionResult };
51
+ /**
52
+ * Resolver for the AI Agent Session record lifecycle. A single {@link SessionManager} instance is
53
+ * shared across requests — it holds no per-user/provider state (only heartbeat-coalescing
54
+ * timestamps), and every method is passed the request `contextUser` + provider explicitly.
55
+ */
56
+ let AgentSessionResolver = class AgentSessionResolver extends ResolverBase {
57
+ constructor() {
58
+ super(...arguments);
59
+ this.sessionManager = new SessionManager();
60
+ }
61
+ /**
62
+ * Open a new session for an agent. Authorization (`CanRun`) is enforced inside
63
+ * {@link SessionManager.CreateSession}; a denial surfaces as a thrown error and no row is written.
64
+ */
65
+ async StartAgentSession(agentId, { userPayload, providers }, conversationId, lastSessionId, configJson) {
66
+ const { contextUser, provider } = this.requireUserAndProvider(userPayload, providers);
67
+ try {
68
+ const session = await this.sessionManager.CreateSession({ agentID: agentId, userID: contextUser.ID, conversationID: conversationId, lastSessionID: lastSessionId, config: configJson }, contextUser, provider);
69
+ return { agentSessionId: session.ID, status: session.Status, conversationId: session.ConversationID ?? '' };
70
+ }
71
+ catch (err) {
72
+ if (err instanceof SessionAuthorizationError) {
73
+ throw new Error(err.message); // authorization denial — no session created
74
+ }
75
+ throw err;
76
+ }
77
+ }
78
+ /**
79
+ * Close a session. Rejects unless the caller owns it. Returns `true` on a successful (or
80
+ * idempotent) close, `false` if the session can't be loaded.
81
+ */
82
+ async CloseAgentSession(agentSessionId, { userPayload, providers }) {
83
+ const { contextUser, provider } = this.requireUserAndProvider(userPayload, providers);
84
+ await this.assertOwnership(agentSessionId, contextUser, provider);
85
+ return this.sessionManager.CloseSession(agentSessionId, contextUser, provider);
86
+ }
87
+ /**
88
+ * Record activity on a session (coalesced). Rejects unless the caller owns it. Returns `true`
89
+ * when the heartbeat was accepted (written or coalesced), `false` if the session is gone/closed.
90
+ */
91
+ async AgentSessionHeartbeat(agentSessionId, { userPayload, providers }) {
92
+ const { contextUser, provider } = this.requireUserAndProvider(userPayload, providers);
93
+ await this.assertOwnership(agentSessionId, contextUser, provider);
94
+ return this.sessionManager.Heartbeat(agentSessionId, contextUser, provider);
95
+ }
96
+ // ----- internals -------------------------------------------------------------------------
97
+ /** Resolve the request user + read-write provider, throwing a clear error if unauthenticated. */
98
+ requireUserAndProvider(userPayload, providers) {
99
+ const contextUser = this.GetUserFromPayload(userPayload);
100
+ if (!contextUser) {
101
+ throw new Error('Not authenticated: no user context for agent session operation');
102
+ }
103
+ return { contextUser, provider: GetReadWriteProvider(providers) };
104
+ }
105
+ /**
106
+ * Inbound ownership gate (the one genuinely new session-authz primitive): the session's `UserID`
107
+ * must equal the caller's. Throws on mismatch or when the session can't be loaded.
108
+ */
109
+ async assertOwnership(agentSessionId, contextUser, provider) {
110
+ const session = await provider.GetEntityObject('MJ: AI Agent Sessions', contextUser);
111
+ const loaded = await session.Load(agentSessionId);
112
+ if (!loaded) {
113
+ throw new Error(`Agent session ${agentSessionId} not found`);
114
+ }
115
+ if (!UUIDsEqual(session.UserID, contextUser.ID)) {
116
+ LogError(`AgentSessionResolver: ownership check failed — user ${contextUser.ID} attempted to operate on session ${agentSessionId} owned by ${session.UserID}`);
117
+ throw new Error('Not authorized: you do not own this agent session');
118
+ }
119
+ }
120
+ };
121
+ __decorate([
122
+ Mutation(() => StartAgentSessionResult),
123
+ __param(0, Arg('agentId')),
124
+ __param(1, Ctx()),
125
+ __param(2, Arg('conversationId', { nullable: true })),
126
+ __param(3, Arg('lastSessionId', { nullable: true })),
127
+ __param(4, Arg('configJson', { nullable: true })),
128
+ __metadata("design:type", Function),
129
+ __metadata("design:paramtypes", [String, Object, String, String, String]),
130
+ __metadata("design:returntype", Promise)
131
+ ], AgentSessionResolver.prototype, "StartAgentSession", null);
132
+ __decorate([
133
+ Mutation(() => Boolean),
134
+ __param(0, Arg('agentSessionId')),
135
+ __param(1, Ctx()),
136
+ __metadata("design:type", Function),
137
+ __metadata("design:paramtypes", [String, Object]),
138
+ __metadata("design:returntype", Promise)
139
+ ], AgentSessionResolver.prototype, "CloseAgentSession", null);
140
+ __decorate([
141
+ Mutation(() => Boolean),
142
+ __param(0, Arg('agentSessionId')),
143
+ __param(1, Ctx()),
144
+ __metadata("design:type", Function),
145
+ __metadata("design:paramtypes", [String, Object]),
146
+ __metadata("design:returntype", Promise)
147
+ ], AgentSessionResolver.prototype, "AgentSessionHeartbeat", null);
148
+ AgentSessionResolver = __decorate([
149
+ Resolver()
150
+ ], AgentSessionResolver);
151
+ export { AgentSessionResolver };
152
+ //# sourceMappingURL=AgentSessionResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentSessionResolver.js","sourceRoot":"","sources":["../../src/resolvers/AgentSessionResolver.ts"],"names":[],"mappings":"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"}