@privos_ai/app-server 0.1.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 (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +90 -0
  3. package/dist/app-descriptor.d.ts +39 -0
  4. package/dist/app-descriptor.d.ts.map +1 -0
  5. package/dist/app-descriptor.js +71 -0
  6. package/dist/app-descriptor.js.map +1 -0
  7. package/dist/auth/user-token.d.ts +44 -0
  8. package/dist/auth/user-token.d.ts.map +1 -0
  9. package/dist/auth/user-token.js +108 -0
  10. package/dist/auth/user-token.js.map +1 -0
  11. package/dist/context/identity-assertions.d.ts +18 -0
  12. package/dist/context/identity-assertions.d.ts.map +1 -0
  13. package/dist/context/identity-assertions.js +37 -0
  14. package/dist/context/identity-assertions.js.map +1 -0
  15. package/dist/context/identity-mode.d.ts +3 -0
  16. package/dist/context/identity-mode.d.ts.map +1 -0
  17. package/dist/context/identity-mode.js +6 -0
  18. package/dist/context/identity-mode.js.map +1 -0
  19. package/dist/context/tool-call-context.d.ts +29 -0
  20. package/dist/context/tool-call-context.d.ts.map +1 -0
  21. package/dist/context/tool-call-context.js +2 -0
  22. package/dist/context/tool-call-context.js.map +1 -0
  23. package/dist/direct/express-router.d.ts +35 -0
  24. package/dist/direct/express-router.d.ts.map +1 -0
  25. package/dist/direct/express-router.js +148 -0
  26. package/dist/direct/express-router.js.map +1 -0
  27. package/dist/direct/http-ingress.d.ts +84 -0
  28. package/dist/direct/http-ingress.d.ts.map +1 -0
  29. package/dist/direct/http-ingress.js +124 -0
  30. package/dist/direct/http-ingress.js.map +1 -0
  31. package/dist/index.d.ts +22 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +13 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/protocol/dispatch.d.ts +7 -0
  36. package/dist/protocol/dispatch.d.ts.map +1 -0
  37. package/dist/protocol/dispatch.js +78 -0
  38. package/dist/protocol/dispatch.js.map +1 -0
  39. package/dist/protocol/errors.d.ts +16 -0
  40. package/dist/protocol/errors.d.ts.map +1 -0
  41. package/dist/protocol/errors.js +84 -0
  42. package/dist/protocol/errors.js.map +1 -0
  43. package/dist/protocol/logging.d.ts +16 -0
  44. package/dist/protocol/logging.d.ts.map +1 -0
  45. package/dist/protocol/logging.js +18 -0
  46. package/dist/protocol/logging.js.map +1 -0
  47. package/dist/protocol/types.d.ts +54 -0
  48. package/dist/protocol/types.d.ts.map +1 -0
  49. package/dist/protocol/types.js +7 -0
  50. package/dist/protocol/types.js.map +1 -0
  51. package/dist/relay/message-adapter.d.ts +9 -0
  52. package/dist/relay/message-adapter.d.ts.map +1 -0
  53. package/dist/relay/message-adapter.js +32 -0
  54. package/dist/relay/message-adapter.js.map +1 -0
  55. package/dist/relay/relay-client.d.ts +63 -0
  56. package/dist/relay/relay-client.d.ts.map +1 -0
  57. package/dist/relay/relay-client.js +447 -0
  58. package/dist/relay/relay-client.js.map +1 -0
  59. package/dist/runtime.d.ts +104 -0
  60. package/dist/runtime.d.ts.map +1 -0
  61. package/dist/runtime.js +351 -0
  62. package/dist/runtime.js.map +1 -0
  63. package/package.json +64 -0
@@ -0,0 +1,447 @@
1
+ import WebSocket from 'ws';
2
+ import { buildPairingMetadata, } from '../app-descriptor.js';
3
+ import { PARSE_ERROR, errorResponse, jsonRpcError, } from '../protocol/errors.js';
4
+ import { AppServerRuntime, DEFAULT_MAX_MESSAGE_BYTES, relayCallerAuthSurface, resolveCallerCredential, } from '../runtime.js';
5
+ import { MessageTooLargeError, rawDataToText } from './message-adapter.js';
6
+ const BACKOFF_MS = [1_000, 2_000, 5_000, 10_000, 30_000];
7
+ const DEFAULT_PAIRING_TIMEOUT_MS = 30_000;
8
+ const DEFAULT_OAUTH_TIMEOUT_MS = 15_000;
9
+ const DEFAULT_OPEN_HANDSHAKE_TIMEOUT_MS = 15_000;
10
+ /**
11
+ * Pair with Privos using a one-time pairing URL.
12
+ * Does not persist credentials — caller is responsible for saving them.
13
+ */
14
+ export function pairOverWebSocket(pairUrl, appMeta, WebSocketImpl = WebSocket, options) {
15
+ const timeoutMs = options?.timeoutMs ?? DEFAULT_PAIRING_TIMEOUT_MS;
16
+ return new Promise((resolve, reject) => {
17
+ const ws = new WebSocketImpl(pairUrl);
18
+ let settled = false;
19
+ const settle = (fn) => {
20
+ if (settled)
21
+ return;
22
+ settled = true;
23
+ clearTimeout(timer);
24
+ fn();
25
+ };
26
+ const timer = setTimeout(() => {
27
+ settle(() => {
28
+ try {
29
+ ws.close();
30
+ }
31
+ catch {
32
+ /* ignore */
33
+ }
34
+ reject(new Error(`Pairing timed out after ${timeoutMs}ms`));
35
+ });
36
+ }, timeoutMs);
37
+ ws.on('open', () => {
38
+ try {
39
+ ws.send(JSON.stringify({
40
+ name: appMeta.name,
41
+ description: appMeta.description || '',
42
+ version: appMeta.version || '0.0.0',
43
+ ...(appMeta.icon && { icon: appMeta.icon }),
44
+ ...(appMeta.scopes?.length && { scopes: appMeta.scopes }),
45
+ }));
46
+ }
47
+ catch (err) {
48
+ settle(() => reject(err instanceof Error ? err : new Error(String(err))));
49
+ }
50
+ });
51
+ ws.on('message', (raw) => {
52
+ try {
53
+ const msg = JSON.parse(rawDataToText(raw));
54
+ if (msg.error) {
55
+ settle(() => reject(new Error(msg.error?.message || 'Pairing failed')));
56
+ return;
57
+ }
58
+ if (msg.result?.paired) {
59
+ const { clientId, clientSecret, relayUrl, app, mcpAppId, appId } = msg.result;
60
+ if (!clientId || !clientSecret || !relayUrl) {
61
+ settle(() => reject(new Error('Pairing response missing credentials')));
62
+ return;
63
+ }
64
+ const privosUrl = relayUrl
65
+ .replace(/^ws/, 'http')
66
+ .replace(/\/api\/v1\/mcp-apps\.relay.*/, '');
67
+ const resolvedAppId = (typeof mcpAppId === 'string' && mcpAppId) ||
68
+ (typeof appId === 'string' && appId) ||
69
+ (typeof app?._id === 'string' && app._id) ||
70
+ undefined;
71
+ settle(() => resolve({
72
+ privosUrl,
73
+ clientId,
74
+ clientSecret,
75
+ mcpAppId: resolvedAppId,
76
+ }));
77
+ try {
78
+ ws.close();
79
+ }
80
+ catch {
81
+ /* ignore */
82
+ }
83
+ }
84
+ }
85
+ catch (err) {
86
+ settle(() => reject(err instanceof Error ? err : new Error(String(err))));
87
+ }
88
+ });
89
+ ws.on('error', (err) => {
90
+ settle(() => reject(new Error(`Pairing failed: ${err.message}`)));
91
+ });
92
+ ws.on('close', (code, reason) => {
93
+ // Any close before a paired result ends the promise (including 1000).
94
+ settle(() => {
95
+ if (code === 1000) {
96
+ reject(new Error('Pairing closed before credentials were received'));
97
+ }
98
+ else {
99
+ reject(new Error(`Pairing closed: ${code} ${reason}`));
100
+ }
101
+ });
102
+ });
103
+ });
104
+ }
105
+ export async function pairFromDescriptor(pairUrl, descriptor, WebSocketImpl, options) {
106
+ return pairOverWebSocket(pairUrl, buildPairingMetadata(descriptor), WebSocketImpl, options);
107
+ }
108
+ /**
109
+ * Connect to PrivOS relay WebSocket with exponential backoff, token refresh,
110
+ * single reconnect timer, and explicit stop().
111
+ */
112
+ export function connectRelay(opts) {
113
+ const fetchImpl = opts.fetchImpl ?? fetch;
114
+ const WebSocketImpl = opts.WebSocketImpl ?? WebSocket;
115
+ const runtime = opts.runtime ??
116
+ new AppServerRuntime({
117
+ descriptor: opts.descriptor,
118
+ handler: opts.handler,
119
+ ui: opts.ui,
120
+ auth: opts.auth,
121
+ mapAppError: opts.mapAppError,
122
+ limits: opts.limits,
123
+ logger: opts.logger,
124
+ });
125
+ const maxMessageBytes = opts.limits?.maxMessageBytes ??
126
+ runtime.getLimits().maxMessageBytes ??
127
+ DEFAULT_MAX_MESSAGE_BYTES;
128
+ const oauthTimeoutMs = opts.oauthTimeoutMs ?? DEFAULT_OAUTH_TIMEOUT_MS;
129
+ const openHandshakeTimeoutMs = opts.openHandshakeTimeoutMs ?? DEFAULT_OPEN_HANDSHAKE_TIMEOUT_MS;
130
+ const maxBufferedBytes = runtime.getLimits().maxBufferedBytes;
131
+ let stopped = false;
132
+ let activeWs = null;
133
+ let reconnectTimer = null;
134
+ let openHandshakeTimer = null;
135
+ let backoffIndex = 0;
136
+ let connectGeneration = 0;
137
+ let oauthAbort = null;
138
+ let connectedResolve = null;
139
+ let connectedReject = null;
140
+ let connectedOnce = false;
141
+ const connectedPromise = new Promise((resolve, reject) => {
142
+ connectedResolve = resolve;
143
+ connectedReject = reject;
144
+ });
145
+ // Prevent unhandledrejection when consumers never call whenConnected().
146
+ // Explicit await whenConnected() still receives the rejection.
147
+ void connectedPromise.catch(() => undefined);
148
+ const log = (event, fields = {}) => {
149
+ opts.logger?.(event, fields);
150
+ };
151
+ const clearReconnectTimer = () => {
152
+ if (reconnectTimer) {
153
+ clearTimeout(reconnectTimer);
154
+ reconnectTimer = null;
155
+ }
156
+ };
157
+ const clearOpenHandshakeTimer = () => {
158
+ if (openHandshakeTimer) {
159
+ clearTimeout(openHandshakeTimer);
160
+ openHandshakeTimer = null;
161
+ }
162
+ };
163
+ const scheduleReconnect = () => {
164
+ if (stopped)
165
+ return;
166
+ if (reconnectTimer)
167
+ return;
168
+ const delay = BACKOFF_MS[Math.min(backoffIndex, BACKOFF_MS.length - 1)] ?? 30_000;
169
+ backoffIndex = Math.min(backoffIndex + 1, BACKOFF_MS.length - 1);
170
+ log('relay.reconnect.scheduled', { delayMs: delay });
171
+ reconnectTimer = setTimeout(() => {
172
+ reconnectTimer = null;
173
+ void openConnection().catch((err) => {
174
+ log('relay.open_unhandled', {
175
+ message: err instanceof Error ? err.message : String(err),
176
+ });
177
+ });
178
+ }, delay);
179
+ };
180
+ async function getAccessToken(signal) {
181
+ const res = await fetchImpl(`${opts.privosUrl}/oauth/token`, {
182
+ method: 'POST',
183
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
184
+ body: `grant_type=client_credentials&client_id=${encodeURIComponent(opts.clientId)}&client_secret=${encodeURIComponent(opts.clientSecret)}`,
185
+ signal,
186
+ });
187
+ if (!res.ok)
188
+ throw new Error(`OAuth token failed: ${res.status} ${res.statusText}`);
189
+ const data = (await res.json());
190
+ if (!data.access_token)
191
+ throw new Error('No access_token in response');
192
+ return data.access_token;
193
+ }
194
+ async function openConnection() {
195
+ if (stopped)
196
+ return;
197
+ const generation = ++connectGeneration;
198
+ oauthAbort?.abort();
199
+ oauthAbort = new AbortController();
200
+ const oauthTimer = setTimeout(() => oauthAbort?.abort(), oauthTimeoutMs);
201
+ try {
202
+ const accessToken = await getAccessToken(oauthAbort.signal);
203
+ if (stopped || generation !== connectGeneration)
204
+ return;
205
+ const wsUrl = opts.privosUrl.replace(/^http/, 'ws') + '/api/v1/mcp-apps.relay';
206
+ const ws = new WebSocketImpl(wsUrl, {
207
+ headers: { Authorization: `Bearer ${accessToken}` },
208
+ });
209
+ if (activeWs && activeWs !== ws) {
210
+ try {
211
+ activeWs.removeAllListeners();
212
+ activeWs.close();
213
+ }
214
+ catch {
215
+ /* ignore */
216
+ }
217
+ }
218
+ activeWs = ws;
219
+ clearOpenHandshakeTimer();
220
+ openHandshakeTimer = setTimeout(() => {
221
+ openHandshakeTimer = null;
222
+ if (stopped || generation !== connectGeneration)
223
+ return;
224
+ if (ws.readyState === WebSocketImpl.OPEN)
225
+ return;
226
+ log('relay.open_handshake_timeout', {
227
+ generation,
228
+ timeoutMs: openHandshakeTimeoutMs,
229
+ });
230
+ try {
231
+ ws.close();
232
+ }
233
+ catch {
234
+ /* ignore */
235
+ }
236
+ // close handler schedules reconnect when generation still current
237
+ }, openHandshakeTimeoutMs);
238
+ ws.on('open', () => {
239
+ clearOpenHandshakeTimer();
240
+ if (stopped || generation !== connectGeneration) {
241
+ try {
242
+ ws.close();
243
+ }
244
+ catch {
245
+ /* ignore */
246
+ }
247
+ return;
248
+ }
249
+ backoffIndex = 0;
250
+ log('relay.connected', { generation });
251
+ if (!connectedOnce) {
252
+ connectedOnce = true;
253
+ connectedResolve?.();
254
+ }
255
+ });
256
+ ws.on('message', (raw) => {
257
+ void handleMessage(ws, generation, raw).catch((err) => {
258
+ log('relay.message_unhandled', {
259
+ reason: 'handler_failed',
260
+ generation,
261
+ ...(err instanceof Error ? { name: err.name } : {}),
262
+ });
263
+ });
264
+ });
265
+ ws.on('ping', () => {
266
+ try {
267
+ ws.pong();
268
+ }
269
+ catch {
270
+ /* ignore */
271
+ }
272
+ });
273
+ ws.on('close', (code) => {
274
+ clearOpenHandshakeTimer();
275
+ log('relay.disconnected', { code, generation });
276
+ if (activeWs === ws)
277
+ activeWs = null;
278
+ if (!stopped && generation === connectGeneration) {
279
+ scheduleReconnect();
280
+ }
281
+ });
282
+ ws.on('error', (err) => {
283
+ log('relay.ws_error', { reason: 'ws_error', generation, name: err.name });
284
+ });
285
+ }
286
+ catch (err) {
287
+ log('relay.connect_failed', {
288
+ message: err instanceof Error ? err.message : String(err),
289
+ generation,
290
+ });
291
+ if (!stopped && generation === connectGeneration) {
292
+ scheduleReconnect();
293
+ }
294
+ }
295
+ finally {
296
+ clearTimeout(oauthTimer);
297
+ }
298
+ }
299
+ function safeSend(ws, payload, rpcFields = {}) {
300
+ if (ws.readyState !== WebSocketImpl.OPEN)
301
+ return;
302
+ if (typeof ws.bufferedAmount === 'number' && ws.bufferedAmount > maxBufferedBytes) {
303
+ log('relay.backpressure', {
304
+ bufferedAmount: ws.bufferedAmount,
305
+ maxBufferedBytes,
306
+ });
307
+ return;
308
+ }
309
+ let text;
310
+ try {
311
+ text = JSON.stringify(payload);
312
+ }
313
+ catch {
314
+ log('relay.serialize_error', { reason: 'json_stringify_failed' });
315
+ return;
316
+ }
317
+ try {
318
+ const payloadObject = payload && typeof payload === 'object' && !Array.isArray(payload)
319
+ ? payload
320
+ : undefined;
321
+ const responseId = payloadObject &&
322
+ Object.prototype.hasOwnProperty.call(payloadObject, 'id') &&
323
+ (typeof payloadObject.id === 'string' ||
324
+ typeof payloadObject.id === 'number' ||
325
+ payloadObject.id === null)
326
+ ? payloadObject.id
327
+ : undefined;
328
+ log('relay.rpc.outbound', {
329
+ direction: '→',
330
+ ...rpcFields,
331
+ ...(responseId !== undefined ? { requestId: responseId } : {}),
332
+ responseKind: payloadObject && 'error' in payloadObject ? 'error' : 'result',
333
+ });
334
+ ws.send(text, (err) => {
335
+ if (err) {
336
+ log('relay.send_error', { reason: 'send_callback_error', name: err.name });
337
+ }
338
+ });
339
+ }
340
+ catch (err) {
341
+ log('relay.send_error', {
342
+ reason: 'send_threw',
343
+ ...(err instanceof Error ? { name: err.name } : {}),
344
+ });
345
+ }
346
+ }
347
+ async function handleMessage(ws, generation, raw) {
348
+ if (stopped || generation !== connectGeneration)
349
+ return;
350
+ let text;
351
+ try {
352
+ text = rawDataToText(raw, maxMessageBytes);
353
+ }
354
+ catch (err) {
355
+ log('relay.message_too_large', {
356
+ message: err instanceof Error ? err.message : String(err),
357
+ ...(err instanceof MessageTooLargeError
358
+ ? { bytes: err.bytes, maxBytes: err.maxBytes }
359
+ : {}),
360
+ });
361
+ try {
362
+ ws.close(1009, 'Message too large');
363
+ }
364
+ catch {
365
+ /* ignore */
366
+ }
367
+ return;
368
+ }
369
+ let parsedJson;
370
+ try {
371
+ parsedJson = JSON.parse(text);
372
+ }
373
+ catch {
374
+ safeSend(ws, errorResponse(null, jsonRpcError(PARSE_ERROR, 'Parse error')), {
375
+ generation,
376
+ });
377
+ return;
378
+ }
379
+ const msgObj = parsedJson && typeof parsedJson === 'object' && !Array.isArray(parsedJson)
380
+ ? parsedJson
381
+ : {};
382
+ const authSurface = relayCallerAuthSurface(msgObj);
383
+ const credentialResolution = await resolveCallerCredential(opts.extractCallerCredential, authSurface);
384
+ const requestId = Object.prototype.hasOwnProperty.call(msgObj, 'id') &&
385
+ (typeof msgObj.id === 'string' || typeof msgObj.id === 'number' || msgObj.id === null)
386
+ ? msgObj.id
387
+ : undefined;
388
+ const method = typeof msgObj.method === 'string' ? msgObj.method : undefined;
389
+ const params = msgObj.params && typeof msgObj.params === 'object' && !Array.isArray(msgObj.params)
390
+ ? msgObj.params
391
+ : undefined;
392
+ const toolName = method === 'tools/call' && typeof params?.name === 'string' ? params.name : undefined;
393
+ log('relay.rpc.inbound', {
394
+ direction: '←',
395
+ generation,
396
+ ...(requestId !== undefined ? { requestId } : { notification: true }),
397
+ ...(method ? { method } : {}),
398
+ ...(toolName ? { toolName } : {}),
399
+ });
400
+ const context = await runtime.buildContext({
401
+ transport: 'relay',
402
+ requestId,
403
+ sessionScope: `ws:${generation}`,
404
+ credentialResolution,
405
+ });
406
+ const outcome = await runtime.dispatchObject(parsedJson, context);
407
+ if (outcome.type === 'no_response' || outcome.type === 'protocol_warning') {
408
+ return;
409
+ }
410
+ safeSend(ws, outcome.response, { generation, method, toolName });
411
+ }
412
+ void openConnection().catch((err) => {
413
+ log('relay.open_unhandled', {
414
+ message: err instanceof Error ? err.message : String(err),
415
+ });
416
+ });
417
+ return {
418
+ whenConnected: () => connectedPromise,
419
+ async stop() {
420
+ stopped = true;
421
+ clearReconnectTimer();
422
+ clearOpenHandshakeTimer();
423
+ connectGeneration += 1;
424
+ oauthAbort?.abort();
425
+ oauthAbort = null;
426
+ const ws = activeWs;
427
+ activeWs = null;
428
+ if (ws) {
429
+ await new Promise((resolve) => {
430
+ try {
431
+ ws.once('close', () => resolve());
432
+ ws.close();
433
+ setTimeout(resolve, 0);
434
+ }
435
+ catch {
436
+ resolve();
437
+ }
438
+ });
439
+ }
440
+ if (!connectedOnce) {
441
+ connectedReject?.(new Error('Relay stopped before connecting'));
442
+ }
443
+ log('relay.stopped', {});
444
+ },
445
+ };
446
+ }
447
+ //# sourceMappingURL=relay-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-client.js","sourceRoot":"","sources":["../../src/relay/relay-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ import { MCP_UI_MIME, type AppDescriptor } from './app-descriptor.js';
2
+ import { type AuthOptions, type CallerCredential } from './auth/user-token.js';
3
+ import type { ToolCallContext } from './context/tool-call-context.js';
4
+ import type { ApplicationMcpRequest, JsonRpcErrorObject, JsonRpcId, McpResponse, ParsedInbound } from './protocol/types.js';
5
+ export type AppMcpHandler = (request: ApplicationMcpRequest, context: ToolCallContext) => Promise<unknown>;
6
+ export type CallerCredentialExtractor<TIngress> = (ingress: TIngress) => CallerCredential | undefined | Promise<CallerCredential | undefined>;
7
+ export type AppErrorMapper = (error: unknown, context: ToolCallContext) => JsonRpcErrorObject | undefined;
8
+ export interface UiResourceProvider {
9
+ uri: string;
10
+ mimeType?: typeof MCP_UI_MIME | string;
11
+ renderHtml(input: {
12
+ params: unknown;
13
+ context: ToolCallContext;
14
+ }): string | Promise<string>;
15
+ }
16
+ export interface RuntimeLimits {
17
+ maxMessageBytes?: number;
18
+ requestTimeoutMs?: number;
19
+ maxInFlightRequests?: number;
20
+ maxResponseBytes?: number;
21
+ /** Max outbound WebSocket bufferedAmount before dropping a send (relay). */
22
+ maxBufferedBytes?: number;
23
+ }
24
+ export interface AppServerRuntimeOptions {
25
+ descriptor: AppDescriptor | (() => AppDescriptor | Promise<AppDescriptor>);
26
+ handler: AppMcpHandler;
27
+ ui?: UiResourceProvider;
28
+ auth?: AuthOptions;
29
+ mapAppError?: AppErrorMapper;
30
+ limits?: RuntimeLimits;
31
+ logger?: (event: string, fields: Record<string, unknown>) => void;
32
+ }
33
+ /** How caller credentials were resolved before JWT verify. */
34
+ export type CallerCredentialResolution = {
35
+ kind: 'absent';
36
+ } | {
37
+ kind: 'present';
38
+ credential: CallerCredential;
39
+ } | {
40
+ kind: 'error';
41
+ message: string;
42
+ };
43
+ export type DispatchOutcome = {
44
+ type: 'response';
45
+ response: McpResponse;
46
+ } | {
47
+ type: 'no_response';
48
+ reason: 'notification' | 'missing_request_id' | 'ignored_response';
49
+ } | {
50
+ type: 'protocol_warning';
51
+ warning: string;
52
+ response?: McpResponse;
53
+ };
54
+ export declare const DEFAULT_MAX_MESSAGE_BYTES: number;
55
+ export declare const DEFAULT_MAX_BUFFERED_BYTES: number;
56
+ /** Distinguish number `1` from string `"1"` without separator collisions. */
57
+ export declare function encodeInFlightId(id: JsonRpcId): string;
58
+ export declare class AppServerRuntime {
59
+ /**
60
+ * Nested map: sessionScope → set of encodeInFlightId(id).
61
+ * Avoids String(id) collisions and colon-join ambiguities.
62
+ */
63
+ private readonly inFlight;
64
+ private readonly opts;
65
+ constructor(opts: AppServerRuntimeOptions);
66
+ getLimits(): Required<Pick<RuntimeLimits, 'maxMessageBytes' | 'requestTimeoutMs' | 'maxInFlightRequests' | 'maxResponseBytes' | 'maxBufferedBytes'>>;
67
+ private inFlightCount;
68
+ private hasInFlight;
69
+ private addInFlight;
70
+ private deleteInFlight;
71
+ resolveDescriptor(): Promise<AppDescriptor>;
72
+ buildContext(input: {
73
+ transport: 'direct' | 'relay';
74
+ requestId?: JsonRpcId;
75
+ /** Required for duplicate-id scope. */
76
+ sessionScope: string;
77
+ credentialResolution?: CallerCredentialResolution;
78
+ traceId?: string;
79
+ signal?: AbortSignal;
80
+ }): Promise<ToolCallContext>;
81
+ dispatchParsed(parsed: ParsedInbound, context: ToolCallContext): Promise<DispatchOutcome>;
82
+ dispatchObject(raw: unknown, context: ToolCallContext): Promise<DispatchOutcome>;
83
+ dispatchText(text: string, context: ToolCallContext): Promise<DispatchOutcome>;
84
+ private handleRequest;
85
+ private log;
86
+ }
87
+ /** Built-in Direct header extractor — never reads body/arguments. */
88
+ export declare function extractDirectCallerCredential(headers: {
89
+ authorization?: string | string[] | undefined;
90
+ 'x-mcp-user-id'?: string | string[] | undefined;
91
+ [key: string]: string | string[] | undefined;
92
+ }): CallerCredential | undefined;
93
+ /**
94
+ * Reserved Relay auth surface only — never includes `params` / `arguments`.
95
+ * Extractors receive this shape, not the full JSON-RPC message.
96
+ */
97
+ export interface RelayCallerAuthSurface {
98
+ _meta?: unknown;
99
+ meta?: unknown;
100
+ }
101
+ export declare function relayCallerAuthSurface(message: Record<string, unknown>): RelayCallerAuthSurface;
102
+ export declare function resolveCallerCredential<TIngress>(extract: CallerCredentialExtractor<TIngress> | undefined, ingress: TIngress): Promise<CallerCredentialResolution>;
103
+ export declare function ephemeralSessionScope(prefix?: string): string;
104
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}