@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,351 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { buildInitializeResult, MCP_UI_MIME, } from './app-descriptor.js';
3
+ import { verifyUserToken, } from './auth/user-token.js';
4
+ import { INTERNAL_ERROR, INVALID_REQUEST, METHOD_NOT_FOUND, SERVER_BUSY, errorResponse, jsonRpcError, normalizeThrownError, resultResponse, } from './protocol/errors.js';
5
+ import { isMcpNotificationMethod, isResultBearingMethod, parseJsonRpcMessage, parseJsonText, } from './protocol/dispatch.js';
6
+ import { estimateJsonBytes, summarizeForLog } from './protocol/logging.js';
7
+ const DEFAULT_MAX_IN_FLIGHT = 32;
8
+ const DEFAULT_REQUEST_TIMEOUT_MS = 60_000;
9
+ const DEFAULT_MAX_RESPONSE_BYTES = 8 * 1024 * 1024;
10
+ export const DEFAULT_MAX_MESSAGE_BYTES = 8 * 1024 * 1024;
11
+ export const DEFAULT_MAX_BUFFERED_BYTES = 8 * 1024 * 1024;
12
+ /** Distinguish number `1` from string `"1"` without separator collisions. */
13
+ export function encodeInFlightId(id) {
14
+ return JSON.stringify([typeof id, id]);
15
+ }
16
+ export class AppServerRuntime {
17
+ /**
18
+ * Nested map: sessionScope → set of encodeInFlightId(id).
19
+ * Avoids String(id) collisions and colon-join ambiguities.
20
+ */
21
+ inFlight = new Map();
22
+ opts;
23
+ constructor(opts) {
24
+ this.opts = opts;
25
+ }
26
+ getLimits() {
27
+ return {
28
+ maxMessageBytes: this.opts.limits?.maxMessageBytes ?? DEFAULT_MAX_MESSAGE_BYTES,
29
+ requestTimeoutMs: this.opts.limits?.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,
30
+ maxInFlightRequests: this.opts.limits?.maxInFlightRequests ?? DEFAULT_MAX_IN_FLIGHT,
31
+ maxResponseBytes: this.opts.limits?.maxResponseBytes ?? DEFAULT_MAX_RESPONSE_BYTES,
32
+ maxBufferedBytes: this.opts.limits?.maxBufferedBytes ?? DEFAULT_MAX_BUFFERED_BYTES,
33
+ };
34
+ }
35
+ inFlightCount() {
36
+ let n = 0;
37
+ for (const set of this.inFlight.values())
38
+ n += set.size;
39
+ return n;
40
+ }
41
+ hasInFlight(sessionScope, id) {
42
+ return this.inFlight.get(sessionScope)?.has(encodeInFlightId(id)) ?? false;
43
+ }
44
+ addInFlight(sessionScope, id) {
45
+ let set = this.inFlight.get(sessionScope);
46
+ if (!set) {
47
+ set = new Set();
48
+ this.inFlight.set(sessionScope, set);
49
+ }
50
+ set.add(encodeInFlightId(id));
51
+ }
52
+ deleteInFlight(sessionScope, id) {
53
+ const set = this.inFlight.get(sessionScope);
54
+ if (!set)
55
+ return;
56
+ set.delete(encodeInFlightId(id));
57
+ if (set.size === 0)
58
+ this.inFlight.delete(sessionScope);
59
+ }
60
+ async resolveDescriptor() {
61
+ const d = this.opts.descriptor;
62
+ return typeof d === 'function' ? await d() : d;
63
+ }
64
+ async buildContext(input) {
65
+ const descriptor = await this.resolveDescriptor();
66
+ const base = {
67
+ transport: input.transport,
68
+ requestId: input.requestId,
69
+ appId: descriptor.id,
70
+ traceId: input.traceId,
71
+ sessionScope: input.sessionScope,
72
+ identityState: 'missing',
73
+ ...(input.signal ? { signal: input.signal } : {}),
74
+ };
75
+ const resolution = input.credentialResolution ?? { kind: 'absent' };
76
+ if (resolution.kind === 'absent') {
77
+ return base;
78
+ }
79
+ if (resolution.kind === 'error') {
80
+ // Do not log extractor Error.message — may contain secrets/URLs.
81
+ this.log('mcp.caller_extractor_error', {
82
+ transport: input.transport,
83
+ reason: 'extractor_failed',
84
+ traceId: input.traceId,
85
+ });
86
+ return { ...base, identityState: 'invalid' };
87
+ }
88
+ if (!resolution.credential.token) {
89
+ return { ...base, identityState: 'invalid' };
90
+ }
91
+ if (!this.opts.auth) {
92
+ return { ...base, identityState: 'invalid' };
93
+ }
94
+ const verified = await verifyUserToken(resolution.credential.token, this.opts.auth, resolution.credential.assertedUserId);
95
+ if (!verified.ok) {
96
+ return {
97
+ ...base,
98
+ identityState: verified.reason === 'missing' ? 'missing' : 'invalid',
99
+ };
100
+ }
101
+ return {
102
+ ...base,
103
+ identityState: 'verified',
104
+ actor: verified.actor,
105
+ roomId: verified.actor.roomId,
106
+ };
107
+ }
108
+ async dispatchParsed(parsed, context) {
109
+ if (parsed.kind === 'response') {
110
+ return { type: 'no_response', reason: 'ignored_response' };
111
+ }
112
+ // JSON-RPC: Parse/Invalid Request without a recoverable id → respond with id: null.
113
+ if (parsed.kind === 'invalid') {
114
+ const id = parsed.id !== undefined ? parsed.id : null;
115
+ return { type: 'response', response: errorResponse(id, parsed.error) };
116
+ }
117
+ if (parsed.kind === 'notification') {
118
+ const method = parsed.message.method;
119
+ if (isMcpNotificationMethod(method)) {
120
+ this.log('mcp.notification', {
121
+ method,
122
+ transport: context.transport,
123
+ traceId: context.traceId,
124
+ });
125
+ return { type: 'no_response', reason: 'notification' };
126
+ }
127
+ // Valid method shape but missing id on a result-bearing call —
128
+ // Hub Streamable HTTP quirk: do not emit a JSON-RPC body (Direct → 202).
129
+ if (isResultBearingMethod(method)) {
130
+ this.log('mcp.missing_request_id', {
131
+ method,
132
+ transport: context.transport,
133
+ warning: 'missing_request_id',
134
+ traceId: context.traceId,
135
+ });
136
+ return { type: 'no_response', reason: 'missing_request_id' };
137
+ }
138
+ return { type: 'no_response', reason: 'notification' };
139
+ }
140
+ const { message } = parsed;
141
+ const method = message.method;
142
+ if (isMcpNotificationMethod(method)) {
143
+ this.log('mcp.notification_with_id', {
144
+ method,
145
+ id: message.id,
146
+ transport: context.transport,
147
+ warning: 'notification_with_id',
148
+ traceId: context.traceId,
149
+ });
150
+ return { type: 'protocol_warning', warning: 'notification_with_id' };
151
+ }
152
+ if (this.hasInFlight(context.sessionScope, message.id)) {
153
+ return {
154
+ type: 'response',
155
+ response: errorResponse(message.id, jsonRpcError(INVALID_REQUEST, 'Duplicate in-flight JSON-RPC id', {
156
+ code: 'DUPLICATE_IN_FLIGHT_ID',
157
+ })),
158
+ };
159
+ }
160
+ const limits = this.getLimits();
161
+ if (this.inFlightCount() >= limits.maxInFlightRequests) {
162
+ return {
163
+ type: 'response',
164
+ response: errorResponse(message.id, jsonRpcError(SERVER_BUSY, 'Too many in-flight requests')),
165
+ };
166
+ }
167
+ this.addInFlight(context.sessionScope, message.id);
168
+ const started = Date.now();
169
+ const abort = new AbortController();
170
+ const onParentAbort = () => abort.abort();
171
+ if (context.signal) {
172
+ if (context.signal.aborted)
173
+ abort.abort();
174
+ else
175
+ context.signal.addEventListener('abort', onParentAbort, { once: true });
176
+ }
177
+ const requestContext = {
178
+ ...context,
179
+ signal: abort.signal,
180
+ };
181
+ // Keep in-flight until the underlying handler settles (even after timeout response).
182
+ const work = this.handleRequest(message.method, message.id, message.params, requestContext).finally(() => {
183
+ this.deleteInFlight(context.sessionScope, message.id);
184
+ context.signal?.removeEventListener('abort', onParentAbort);
185
+ });
186
+ try {
187
+ const result = await raceWithTimeout(work, abort, limits.requestTimeoutMs);
188
+ const response = resultResponse(message.id, result);
189
+ const bytes = estimateJsonBytes(response);
190
+ if (bytes < 0 || bytes > limits.maxResponseBytes) {
191
+ return {
192
+ type: 'response',
193
+ response: errorResponse(message.id, jsonRpcError(INTERNAL_ERROR, 'Response too large', {
194
+ code: 'RESPONSE_TOO_LARGE',
195
+ })),
196
+ };
197
+ }
198
+ this.log('mcp.request.ok', summarizeForLog({
199
+ method,
200
+ toolName: method === 'tools/call' ? toolNameFromParams(message.params) : undefined,
201
+ id: message.id,
202
+ durationMs: Date.now() - started,
203
+ resultBytes: bytes,
204
+ identityState: context.identityState,
205
+ transport: context.transport,
206
+ traceId: context.traceId,
207
+ }));
208
+ return { type: 'response', response };
209
+ }
210
+ catch (err) {
211
+ // Swallow late handler rejection after we already timed out / responded.
212
+ void work.catch(() => undefined);
213
+ const error = normalizeThrownError(err, (e) => this.opts.mapAppError?.(e, requestContext));
214
+ this.log('mcp.request.error', summarizeForLog({
215
+ method,
216
+ toolName: method === 'tools/call' ? toolNameFromParams(message.params) : undefined,
217
+ id: message.id,
218
+ durationMs: Date.now() - started,
219
+ errorCode: error.code,
220
+ identityState: context.identityState,
221
+ transport: context.transport,
222
+ traceId: context.traceId,
223
+ }));
224
+ return { type: 'response', response: errorResponse(message.id, error) };
225
+ }
226
+ }
227
+ async dispatchObject(raw, context) {
228
+ return this.dispatchParsed(parseJsonRpcMessage(raw), context);
229
+ }
230
+ async dispatchText(text, context) {
231
+ return this.dispatchParsed(parseJsonText(text), context);
232
+ }
233
+ async handleRequest(method, id, params, context) {
234
+ if (method === 'initialize') {
235
+ const descriptor = await this.resolveDescriptor();
236
+ return buildInitializeResult(descriptor, { uiEnabled: Boolean(this.opts.ui) });
237
+ }
238
+ if (method === 'resources/read' && this.opts.ui) {
239
+ const uri = params?.uri;
240
+ if (uri === this.opts.ui.uri) {
241
+ const html = await this.opts.ui.renderHtml({ params, context });
242
+ return {
243
+ contents: [
244
+ {
245
+ uri: this.opts.ui.uri,
246
+ mimeType: this.opts.ui.mimeType ?? MCP_UI_MIME,
247
+ text: html,
248
+ },
249
+ ],
250
+ };
251
+ }
252
+ }
253
+ const applicationMethods = new Set(['tools/list', 'tools/call', 'resources/read']);
254
+ if (!applicationMethods.has(method)) {
255
+ throw Object.assign(new Error(`Method not found: ${method}`), {
256
+ code: METHOD_NOT_FOUND,
257
+ });
258
+ }
259
+ const request = {
260
+ jsonrpc: '2.0',
261
+ id,
262
+ method: method,
263
+ ...(params !== undefined ? { params } : {}),
264
+ };
265
+ return await this.opts.handler(request, context);
266
+ }
267
+ log(event, fields) {
268
+ this.opts.logger?.(event, fields);
269
+ }
270
+ }
271
+ async function raceWithTimeout(work, abort, ms) {
272
+ let timer;
273
+ try {
274
+ return await Promise.race([
275
+ work,
276
+ new Promise((_, reject) => {
277
+ timer = setTimeout(() => {
278
+ abort.abort();
279
+ reject(Object.assign(new Error('Request timed out'), {
280
+ code: INTERNAL_ERROR,
281
+ data: { code: 'REQUEST_TIMEOUT' },
282
+ }));
283
+ }, ms);
284
+ }),
285
+ ]);
286
+ }
287
+ finally {
288
+ if (timer)
289
+ clearTimeout(timer);
290
+ }
291
+ }
292
+ function toolNameFromParams(params) {
293
+ if (params && typeof params === 'object' && 'name' in params) {
294
+ const name = params.name;
295
+ return typeof name === 'string' ? name : undefined;
296
+ }
297
+ return undefined;
298
+ }
299
+ /** Built-in Direct header extractor — never reads body/arguments. */
300
+ export function extractDirectCallerCredential(headers) {
301
+ const auth = headerValue(headers.authorization);
302
+ if (!auth?.startsWith('Bearer '))
303
+ return undefined;
304
+ const token = auth.slice('Bearer '.length).trim();
305
+ if (!token)
306
+ return undefined;
307
+ const asserted = headerValue(headers['x-mcp-user-id']);
308
+ return {
309
+ token,
310
+ ...(asserted ? { assertedUserId: asserted } : {}),
311
+ source: 'direct-header',
312
+ };
313
+ }
314
+ export function relayCallerAuthSurface(message) {
315
+ const surface = {};
316
+ if (Object.prototype.hasOwnProperty.call(message, '_meta')) {
317
+ surface._meta = message._meta;
318
+ }
319
+ if (Object.prototype.hasOwnProperty.call(message, 'meta')) {
320
+ surface.meta = message.meta;
321
+ }
322
+ return surface;
323
+ }
324
+ export async function resolveCallerCredential(extract, ingress) {
325
+ if (!extract)
326
+ return { kind: 'absent' };
327
+ try {
328
+ const credential = await extract(ingress);
329
+ if (!credential)
330
+ return { kind: 'absent' };
331
+ if (typeof credential.token !== 'string' || !credential.token) {
332
+ return { kind: 'error', message: 'Caller credential missing token' };
333
+ }
334
+ return { kind: 'present', credential };
335
+ }
336
+ catch (err) {
337
+ return {
338
+ kind: 'error',
339
+ message: err instanceof Error ? err.message : 'Caller credential extractor failed',
340
+ };
341
+ }
342
+ }
343
+ export function ephemeralSessionScope(prefix = 'req') {
344
+ return `${prefix}:${randomUUID()}`;
345
+ }
346
+ function headerValue(value) {
347
+ if (Array.isArray(value))
348
+ return value[0];
349
+ return value;
350
+ }
351
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@privos_ai/app-server",
3
+ "version": "0.1.0",
4
+ "description": "Business-agnostic PrivOS MCP App server runtime — Direct HTTP + Relay WebSocket",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ },
13
+ "./auth": {
14
+ "types": "./dist/auth/user-token.d.ts",
15
+ "import": "./dist/auth/user-token.js"
16
+ },
17
+ "./direct": {
18
+ "types": "./dist/direct/express-router.d.ts",
19
+ "import": "./dist/direct/express-router.js"
20
+ },
21
+ "./direct/http-ingress": {
22
+ "types": "./dist/direct/http-ingress.d.ts",
23
+ "import": "./dist/direct/http-ingress.js"
24
+ },
25
+ "./relay": {
26
+ "types": "./dist/relay/relay-client.d.ts",
27
+ "import": "./dist/relay/relay-client.js"
28
+ }
29
+ },
30
+ "files": [
31
+ "dist",
32
+ "README.md",
33
+ "LICENSE"
34
+ ],
35
+ "publishConfig": {
36
+ "access": "public"
37
+ },
38
+ "scripts": {
39
+ "build": "tsc -p tsconfig.build.json",
40
+ "prepack": "npm run build",
41
+ "test": "vitest run",
42
+ "test:watch": "vitest",
43
+ "typecheck": "tsc --noEmit -p tsconfig.json",
44
+ "pack:check": "npm pack --dry-run"
45
+ },
46
+ "peerDependencies": {
47
+ "express": "^4.18.0 || ^5.0.0"
48
+ },
49
+ "dependencies": {
50
+ "jose": "^5.9.6",
51
+ "ws": "^8.18.0"
52
+ },
53
+ "devDependencies": {
54
+ "@types/express": "^4.17.25",
55
+ "@types/node": "^22.10.0",
56
+ "@types/supertest": "^7.2.0",
57
+ "@types/ws": "^8.18.1",
58
+ "express": "^4.22.2",
59
+ "supertest": "^7.2.0",
60
+ "typescript": "^5.9.3",
61
+ "vitest": "^4.1.10"
62
+ },
63
+ "license": "MIT"
64
+ }