@selvajs/server 1.5.0-beta.6 → 1.5.0-beta.8

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 (85) hide show
  1. package/dist/access/guards.d.ts.map +1 -1
  2. package/dist/access/guards.js +2 -6
  3. package/dist/access/guards.js.map +1 -1
  4. package/dist/api/respond.d.ts +6 -1
  5. package/dist/api/respond.d.ts.map +1 -1
  6. package/dist/api/respond.js +2 -2
  7. package/dist/api/respond.js.map +1 -1
  8. package/dist/definitions/definition-service.d.ts.map +1 -1
  9. package/dist/definitions/definition-service.js +7 -1
  10. package/dist/definitions/definition-service.js.map +1 -1
  11. package/dist/definitions/index.d.ts +1 -1
  12. package/dist/definitions/index.d.ts.map +1 -1
  13. package/dist/definitions/index.js +1 -1
  14. package/dist/definitions/index.js.map +1 -1
  15. package/dist/definitions/visibility.d.ts +35 -1
  16. package/dist/definitions/visibility.d.ts.map +1 -1
  17. package/dist/definitions/visibility.js +91 -5
  18. package/dist/definitions/visibility.js.map +1 -1
  19. package/dist/handlers/apiTokens.d.ts +34 -3
  20. package/dist/handlers/apiTokens.d.ts.map +1 -1
  21. package/dist/handlers/apiTokens.js +45 -12
  22. package/dist/handlers/apiTokens.js.map +1 -1
  23. package/dist/handlers/definitions.d.ts +7 -1
  24. package/dist/handlers/definitions.d.ts.map +1 -1
  25. package/dist/handlers/definitions.js +24 -7
  26. package/dist/handlers/definitions.js.map +1 -1
  27. package/dist/handlers/index.d.ts +2 -1
  28. package/dist/handlers/index.d.ts.map +1 -1
  29. package/dist/handlers/index.js +2 -1
  30. package/dist/handlers/index.js.map +1 -1
  31. package/dist/handlers/me.d.ts.map +1 -1
  32. package/dist/handlers/me.js +9 -1
  33. package/dist/handlers/me.js.map +1 -1
  34. package/dist/handlers/oauthConsent.d.ts +37 -0
  35. package/dist/handlers/oauthConsent.d.ts.map +1 -0
  36. package/dist/handlers/oauthConsent.js +63 -0
  37. package/dist/handlers/oauthConsent.js.map +1 -0
  38. package/dist/handlers/projects.d.ts +5 -0
  39. package/dist/handlers/projects.d.ts.map +1 -1
  40. package/dist/handlers/projects.js +19 -3
  41. package/dist/handlers/projects.js.map +1 -1
  42. package/dist/http/api-token.d.ts +8 -3
  43. package/dist/http/api-token.d.ts.map +1 -1
  44. package/dist/http/api-token.js +11 -1
  45. package/dist/http/api-token.js.map +1 -1
  46. package/dist/http/csrf.d.ts +18 -0
  47. package/dist/http/csrf.d.ts.map +1 -0
  48. package/dist/http/csrf.js +37 -0
  49. package/dist/http/csrf.js.map +1 -0
  50. package/dist/http/index.d.ts +1 -0
  51. package/dist/http/index.d.ts.map +1 -1
  52. package/dist/http/index.js +1 -0
  53. package/dist/http/index.js.map +1 -1
  54. package/dist/oauth/index.d.ts +160 -0
  55. package/dist/oauth/index.d.ts.map +1 -0
  56. package/dist/oauth/index.js +465 -0
  57. package/dist/oauth/index.js.map +1 -0
  58. package/dist/organizations/index.d.ts +1 -0
  59. package/dist/organizations/index.d.ts.map +1 -1
  60. package/dist/organizations/index.js +1 -0
  61. package/dist/organizations/index.js.map +1 -1
  62. package/dist/organizations/user-memberships.d.ts +11 -0
  63. package/dist/organizations/user-memberships.d.ts.map +1 -0
  64. package/dist/organizations/user-memberships.js +23 -0
  65. package/dist/organizations/user-memberships.js.map +1 -0
  66. package/dist/testing/harness.d.ts +3 -1
  67. package/dist/testing/harness.d.ts.map +1 -1
  68. package/dist/testing/harness.js +6 -1
  69. package/dist/testing/harness.js.map +1 -1
  70. package/dist/testing/index.d.ts +1 -1
  71. package/dist/testing/index.d.ts.map +1 -1
  72. package/dist/testing/index.js +1 -1
  73. package/dist/testing/index.js.map +1 -1
  74. package/dist/testing/scenarios.d.ts +6 -0
  75. package/dist/testing/scenarios.d.ts.map +1 -1
  76. package/dist/testing/scenarios.js +12 -1
  77. package/dist/testing/scenarios.js.map +1 -1
  78. package/dist/tokens/api-token-holder.d.ts +22 -6
  79. package/dist/tokens/api-token-holder.d.ts.map +1 -1
  80. package/dist/tokens/api-token-holder.js +25 -4
  81. package/dist/tokens/api-token-holder.js.map +1 -1
  82. package/dist/tokens/index.d.ts +1 -1
  83. package/dist/tokens/index.d.ts.map +1 -1
  84. package/dist/tokens/index.js.map +1 -1
  85. package/package.json +11 -6
@@ -0,0 +1,465 @@
1
+ /**
2
+ * OAuth 2.1 for MCP clients and the Grasshopper plugin, with this instance as
3
+ * its own authorization server.
4
+ *
5
+ * The access token is an ordinary API token. The host mints it while the user is
6
+ * signed in, at consent, through the same path as Team → API tokens; this
7
+ * module seals the raw key into the authorization code and hands it over at the
8
+ * token endpoint. So `/mcp` and `/api/v1` keep one credential type.
9
+ *
10
+ * Nothing here is stored. A registered client's id is its own signed metadata,
11
+ * and a code is its own encrypted grant, bound to the issuing origin. The only
12
+ * state is the set of redeemed codes, in the host's memory, so on several
13
+ * replicas a code could be redeemed once per replica within its minute, and only
14
+ * by whoever holds the PKCE verifier.
15
+ */
16
+ import { createCipheriv, createDecipheriv, createHash, createHmac, hkdfSync, randomBytes, timingSafeEqual } from 'node:crypto';
17
+ /** The scopes a grant can carry. Each maps to one org-wide API scope. */
18
+ export const OAUTH_SCOPES = ['read', 'solve', 'upload'];
19
+ /**
20
+ * All a registered (DCR or CIMD) client can be granted. Its name and redirects
21
+ * are whatever the registrant chose, so `upload`, which puts code on the org's
22
+ * Compute server, stays with the built-in client and a look-alike can't phish for it.
23
+ */
24
+ export const REGISTERED_CLIENT_SCOPES = ['read', 'solve'];
25
+ /** The Grasshopper plugin's client id. Built in, so it needs no registration and works air-gapped. */
26
+ export const GRASSHOPPER_CLIENT_ID = 'selva-grasshopper';
27
+ // Loopback on any port (RFC 8252 §7.3), but only this host and path: the code
28
+ // can only ever reach a program on the user's own machine.
29
+ const GRASSHOPPER_CLIENT = {
30
+ clientId: GRASSHOPPER_CLIENT_ID,
31
+ name: 'Selva for Grasshopper',
32
+ redirectUris: ['http://127.0.0.1/callback'],
33
+ builtIn: true,
34
+ scopes: ['read', 'upload']
35
+ };
36
+ export const MCP_PATH = '/mcp';
37
+ const CODE_TTL_MS = 60_000;
38
+ const CLIENT_NAME_MAX = 100;
39
+ const REDIRECT_URIS_MAX = 10;
40
+ const CIMD_TTL_MS = 60 * 60_000;
41
+ // A failing metadata URL is not refetched for this long: each fetch is outbound
42
+ // work an anonymous caller could otherwise trigger at will.
43
+ const CIMD_FAILURE_TTL_MS = 60_000;
44
+ const CIMD_CACHE_MAX = 500;
45
+ const LOOPBACK_HOSTS = new Set(['localhost', '127.0.0.1', '[::1]']);
46
+ export class OAuthError extends Error {
47
+ error;
48
+ status;
49
+ constructor(
50
+ /** RFC 6749 / 7591 error code. */
51
+ error, description, status = 400) {
52
+ super(description);
53
+ this.error = error;
54
+ this.status = status;
55
+ this.name = 'OAuthError';
56
+ }
57
+ toBody() {
58
+ return { error: this.error, error_description: this.message };
59
+ }
60
+ }
61
+ // ============================================================================
62
+ // Discovery documents
63
+ // ============================================================================
64
+ export function mcpResourceUrl(origin) {
65
+ return origin + MCP_PATH;
66
+ }
67
+ export function resourceMetadataUrl(origin) {
68
+ return `${origin}/.well-known/oauth-protected-resource${MCP_PATH}`;
69
+ }
70
+ /** RFC 9728. Claude uses only the first authorization server. */
71
+ export function protectedResourceMetadata(origin) {
72
+ return {
73
+ resource: mcpResourceUrl(origin),
74
+ authorization_servers: [origin],
75
+ scopes_supported: [...REGISTERED_CLIENT_SCOPES],
76
+ bearer_methods_supported: ['header']
77
+ };
78
+ }
79
+ /**
80
+ * RFC 8414. Claude picks Client ID Metadata Documents only when both
81
+ * `client_id_metadata_document_supported` and the `none` auth method appear.
82
+ */
83
+ export function authorizationServerMetadata(origin) {
84
+ return {
85
+ issuer: origin,
86
+ authorization_endpoint: `${origin}/oauth/authorize`,
87
+ token_endpoint: `${origin}/oauth/token`,
88
+ registration_endpoint: `${origin}/oauth/register`,
89
+ response_types_supported: ['code'],
90
+ grant_types_supported: ['authorization_code'],
91
+ code_challenge_methods_supported: ['S256'],
92
+ token_endpoint_auth_methods_supported: ['none'],
93
+ scopes_supported: [...OAUTH_SCOPES],
94
+ client_id_metadata_document_supported: true,
95
+ authorization_response_iss_parameter_supported: true
96
+ };
97
+ }
98
+ // ============================================================================
99
+ // Server
100
+ // ============================================================================
101
+ export function createOAuthServer(options) {
102
+ const { origin } = options;
103
+ const now = options.now ?? Date.now;
104
+ const signKey = derive(options.secret, 'selva-oauth-client');
105
+ const codeKey = derive(options.secret, `selva-oauth-code:${origin}`);
106
+ const redeemed = options.redeemedCodes ?? new Map();
107
+ const metadataCache = new Map();
108
+ // ==========================================================================
109
+ // Clients
110
+ // ==========================================================================
111
+ /** RFC 7591. The client id carries the metadata, signed, so nothing is stored. */
112
+ function register(input) {
113
+ try {
114
+ const meta = (input ?? {});
115
+ const redirectUris = checkRedirectUris(meta.redirect_uris);
116
+ const name = typeof meta.client_name === 'string' ? meta.client_name.trim() : '';
117
+ const payload = b64(JSON.stringify({ n: name.slice(0, CLIENT_NAME_MAX), r: redirectUris, t: now() }));
118
+ const clientId = `dcr_${payload}.${sign(signKey, payload)}`;
119
+ return {
120
+ status: 201,
121
+ body: {
122
+ client_id: clientId,
123
+ client_id_issued_at: Math.floor(now() / 1000),
124
+ client_name: name || undefined,
125
+ redirect_uris: redirectUris,
126
+ grant_types: ['authorization_code'],
127
+ response_types: ['code'],
128
+ token_endpoint_auth_method: 'none'
129
+ }
130
+ };
131
+ }
132
+ catch (err) {
133
+ if (err instanceof OAuthError)
134
+ return { status: err.status, body: err.toBody() };
135
+ throw err;
136
+ }
137
+ }
138
+ async function resolveClient(clientId) {
139
+ if (clientId === GRASSHOPPER_CLIENT_ID)
140
+ return GRASSHOPPER_CLIENT;
141
+ if (clientId.startsWith('dcr_'))
142
+ return registeredClient(clientId);
143
+ if (clientId.startsWith('https://'))
144
+ return metadataClient(clientId);
145
+ throw new OAuthError('invalid_client', 'Unknown client.');
146
+ }
147
+ function registeredClient(clientId) {
148
+ const [payload, signature] = clientId.slice('dcr_'.length).split('.');
149
+ if (!payload || !signature || !safeEqual(signature, sign(signKey, payload))) {
150
+ throw new OAuthError('invalid_client', 'Unknown client.');
151
+ }
152
+ const meta = JSON.parse(unb64(payload));
153
+ return {
154
+ clientId,
155
+ name: meta.n || 'An MCP client',
156
+ redirectUris: meta.r,
157
+ builtIn: false,
158
+ scopes: REGISTERED_CLIENT_SCOPES
159
+ };
160
+ }
161
+ async function metadataClient(url) {
162
+ const cached = metadataCache.get(url);
163
+ if (cached) {
164
+ if ('client' in cached && now() - cached.at < CIMD_TTL_MS)
165
+ return cached.client;
166
+ if ('failure' in cached && now() - cached.at < CIMD_FAILURE_TTL_MS)
167
+ throw cached.failure;
168
+ }
169
+ if (!options.fetchClientMetadata) {
170
+ throw new OAuthError('invalid_client', 'This server does not accept URL client ids.');
171
+ }
172
+ try {
173
+ const client = await readMetadata(url, options.fetchClientMetadata);
174
+ remember(url, { at: now(), client });
175
+ return client;
176
+ }
177
+ catch (err) {
178
+ if (!(err instanceof OAuthError))
179
+ throw err;
180
+ remember(url, { at: now(), failure: err });
181
+ throw err;
182
+ }
183
+ }
184
+ function remember(url, entry) {
185
+ if (metadataCache.size >= CIMD_CACHE_MAX) {
186
+ metadataCache.delete(metadataCache.keys().next().value);
187
+ }
188
+ metadataCache.set(url, entry);
189
+ }
190
+ // ==========================================================================
191
+ // Authorization
192
+ // ==========================================================================
193
+ /**
194
+ * Validates the query `/oauth/authorize` arrives with. An `OAuthError` from a
195
+ * bad client or redirect URI must be shown, not redirected: the redirect target
196
+ * is exactly what can't be trusted.
197
+ */
198
+ async function parseAuthorizeRequest(query) {
199
+ const client = await resolveClient(query.get('client_id') ?? '');
200
+ const redirectUri = query.get('redirect_uri') ?? '';
201
+ if (!client.redirectUris.some((r) => redirectMatches(r, redirectUri))) {
202
+ throw new OAuthError('invalid_request', 'The redirect URI is not registered for this client.');
203
+ }
204
+ if (query.get('response_type') !== 'code') {
205
+ throw new OAuthError('unsupported_response_type', 'Only response_type=code is supported.');
206
+ }
207
+ const codeChallenge = query.get('code_challenge') ?? '';
208
+ if (!codeChallenge || query.get('code_challenge_method') !== 'S256') {
209
+ throw new OAuthError('invalid_request', 'PKCE with code_challenge_method=S256 is required.');
210
+ }
211
+ const resource = query.get('resource') ?? mcpResourceUrl(origin);
212
+ if (!isThisResource(resource)) {
213
+ throw new OAuthError('invalid_target', 'The resource is not this server.');
214
+ }
215
+ return {
216
+ client,
217
+ redirectUri,
218
+ state: query.get('state') ?? undefined,
219
+ codeChallenge,
220
+ scopes: parseScopes(query.get('scope'), client.scopes),
221
+ resource
222
+ };
223
+ }
224
+ /** Where to send the browser after consent: the client's redirect URI with a code. */
225
+ function approve(request, grant) {
226
+ const code = seal(codeKey, {
227
+ c: request.client.clientId,
228
+ r: request.redirectUri,
229
+ p: request.codeChallenge,
230
+ x: now() + CODE_TTL_MS,
231
+ g: grant
232
+ });
233
+ return withParams(request.redirectUri, { code, state: request.state, iss: origin });
234
+ }
235
+ function deny(request) {
236
+ return withParams(request.redirectUri, {
237
+ error: 'access_denied',
238
+ state: request.state,
239
+ iss: origin
240
+ });
241
+ }
242
+ // ==========================================================================
243
+ // Token endpoint
244
+ // ==========================================================================
245
+ function exchange(form) {
246
+ try {
247
+ if (form.get('grant_type') !== 'authorization_code') {
248
+ throw new OAuthError('unsupported_grant_type', 'Only authorization_code is supported.');
249
+ }
250
+ const code = form.get('code') ?? '';
251
+ const sealed = open(codeKey, code);
252
+ if (!sealed || sealed.x < now()) {
253
+ throw new OAuthError('invalid_grant', 'The code is invalid or expired.');
254
+ }
255
+ if (sealed.c !== form.get('client_id') || sealed.r !== form.get('redirect_uri')) {
256
+ throw new OAuthError('invalid_grant', 'The code was issued to another client.');
257
+ }
258
+ const verifier = form.get('code_verifier') ?? '';
259
+ if (!safeEqual(createHash('sha256').update(verifier).digest('base64url'), sealed.p)) {
260
+ throw new OAuthError('invalid_grant', 'The code_verifier does not match.');
261
+ }
262
+ const resource = form.get('resource');
263
+ if (resource !== null && !isThisResource(resource)) {
264
+ throw new OAuthError('invalid_target', 'The resource is not this server.');
265
+ }
266
+ if (!markRedeemed(code, sealed.x)) {
267
+ throw new OAuthError('invalid_grant', 'The code was already used.');
268
+ }
269
+ const { g } = sealed;
270
+ return {
271
+ status: 200,
272
+ body: {
273
+ access_token: g.secret,
274
+ token_type: 'Bearer',
275
+ expires_in: Math.max(0, Math.floor((Date.parse(g.expiresAt) - now()) / 1000)),
276
+ scope: g.scopes.join(' ')
277
+ }
278
+ };
279
+ }
280
+ catch (err) {
281
+ if (err instanceof OAuthError)
282
+ return { status: err.status, body: err.toBody() };
283
+ throw err;
284
+ }
285
+ }
286
+ function markRedeemed(code, expiresAt) {
287
+ const t = now();
288
+ for (const [k, x] of redeemed)
289
+ if (x < t)
290
+ redeemed.delete(k);
291
+ const id = createHash('sha256').update(code).digest('base64url');
292
+ if (redeemed.has(id))
293
+ return false;
294
+ redeemed.set(id, expiresAt);
295
+ return true;
296
+ }
297
+ function isThisResource(resource) {
298
+ const r = resource.replace(/\/$/, '');
299
+ return r === origin || r === mcpResourceUrl(origin);
300
+ }
301
+ return {
302
+ register,
303
+ resolveClient,
304
+ parseAuthorizeRequest,
305
+ approve,
306
+ deny,
307
+ exchange,
308
+ protectedResourceMetadata: () => protectedResourceMetadata(origin),
309
+ authorizationServerMetadata: () => authorizationServerMetadata(origin)
310
+ };
311
+ }
312
+ /** OAuth scopes to the API scopes a minted token gets. */
313
+ export function apiScopesFor(scopes) {
314
+ return scopes.map((s) => `${s}:all`);
315
+ }
316
+ // ============================================================================
317
+ // Helpers
318
+ // ============================================================================
319
+ async function readMetadata(url, fetchClientMetadata) {
320
+ let doc;
321
+ try {
322
+ doc = (await fetchClientMetadata(url));
323
+ }
324
+ catch {
325
+ throw new OAuthError('invalid_client', 'The client metadata document could not be read.');
326
+ }
327
+ if (doc?.client_id !== url) {
328
+ throw new OAuthError('invalid_client', 'The metadata document names a different client_id.');
329
+ }
330
+ return {
331
+ clientId: url,
332
+ name: typeof doc.client_name === 'string' && doc.client_name.trim()
333
+ ? doc.client_name.trim().slice(0, CLIENT_NAME_MAX)
334
+ : new URL(url).host,
335
+ redirectUris: checkRedirectUris(doc.redirect_uris),
336
+ builtIn: false,
337
+ scopes: REGISTERED_CLIENT_SCOPES
338
+ };
339
+ }
340
+ /**
341
+ * What the request asks for, within what its client may have. A scope outside
342
+ * that is dropped, not refused, so a client that asks for every advertised
343
+ * scope still signs in with what it may have. Asking for none of them means all
344
+ * of them. `read` rides along with `solve`, which the consent page offers as
345
+ * "read and run solves".
346
+ */
347
+ function parseScopes(raw, allowed) {
348
+ const asked = (raw ?? '')
349
+ .split(' ')
350
+ .filter((s) => allowed.includes(s));
351
+ if (!asked.length)
352
+ return [...allowed];
353
+ return allowed.filter((s) => asked.includes(s) || (s === 'read' && asked.includes('solve')));
354
+ }
355
+ /**
356
+ * The access levels a consent page offers for a request, narrowest first. The
357
+ * user may narrow what the client asked for, never widen it. An upload request
358
+ * is offered as asked: narrowing it to read would leave the client unable to
359
+ * do the one thing it signed in for.
360
+ */
361
+ export function consentChoices(scopes) {
362
+ if (scopes.includes('upload'))
363
+ return [{ access: 'upload', scopes: [...scopes] }];
364
+ const choices = [{ access: 'read', scopes: ['read'] }];
365
+ if (scopes.includes('solve'))
366
+ choices.push({ access: 'solve', scopes: [...scopes] });
367
+ return choices;
368
+ }
369
+ function checkRedirectUris(value) {
370
+ if (!Array.isArray(value) || !value.length || value.length > REDIRECT_URIS_MAX) {
371
+ throw new OAuthError('invalid_redirect_uri', 'Give between 1 and 10 redirect_uris.');
372
+ }
373
+ for (const uri of value) {
374
+ if (typeof uri !== 'string' || !isAllowedRedirect(uri)) {
375
+ throw new OAuthError('invalid_redirect_uri', 'Redirect URIs must be https, or http on a loopback address.');
376
+ }
377
+ }
378
+ return value;
379
+ }
380
+ function isAllowedRedirect(uri) {
381
+ let url;
382
+ try {
383
+ url = new URL(uri);
384
+ }
385
+ catch {
386
+ return false;
387
+ }
388
+ if (url.hash)
389
+ return false;
390
+ return (url.protocol === 'https:' || (url.protocol === 'http:' && LOOPBACK_HOSTS.has(url.hostname)));
391
+ }
392
+ /** A redirect to a program on the user's own machine, which any local process can claim. */
393
+ export function isLoopbackRedirect(uri) {
394
+ try {
395
+ return LOOPBACK_HOSTS.has(new URL(uri).hostname);
396
+ }
397
+ catch {
398
+ return false;
399
+ }
400
+ }
401
+ /** Exact, except a loopback redirect matches on any port (RFC 8252 §7.3). */
402
+ export function redirectMatches(registered, requested) {
403
+ if (registered === requested)
404
+ return true;
405
+ let a, b;
406
+ try {
407
+ a = new URL(registered);
408
+ b = new URL(requested);
409
+ }
410
+ catch {
411
+ return false;
412
+ }
413
+ return (a.protocol === 'http:' &&
414
+ b.protocol === 'http:' &&
415
+ LOOPBACK_HOSTS.has(a.hostname) &&
416
+ a.hostname === b.hostname &&
417
+ a.pathname === b.pathname &&
418
+ a.search === b.search &&
419
+ !b.hash &&
420
+ !b.username &&
421
+ !b.password);
422
+ }
423
+ function withParams(uri, params) {
424
+ const url = new URL(uri);
425
+ for (const [k, v] of Object.entries(params))
426
+ if (v !== undefined)
427
+ url.searchParams.set(k, v);
428
+ return url.toString();
429
+ }
430
+ function derive(secret, info) {
431
+ return Buffer.from(hkdfSync('sha256', secret, '', info, 32));
432
+ }
433
+ function sign(key, data) {
434
+ return createHmac('sha256', key).update(data).digest('base64url');
435
+ }
436
+ function seal(key, value) {
437
+ const iv = randomBytes(12);
438
+ const cipher = createCipheriv('aes-256-gcm', key, iv);
439
+ const body = Buffer.concat([cipher.update(JSON.stringify(value)), cipher.final()]);
440
+ return Buffer.concat([iv, cipher.getAuthTag(), body]).toString('base64url');
441
+ }
442
+ function open(key, sealed) {
443
+ try {
444
+ const raw = Buffer.from(sealed, 'base64url');
445
+ const decipher = createDecipheriv('aes-256-gcm', key, raw.subarray(0, 12));
446
+ decipher.setAuthTag(raw.subarray(12, 28));
447
+ const body = Buffer.concat([decipher.update(raw.subarray(28)), decipher.final()]);
448
+ return JSON.parse(body.toString('utf8'));
449
+ }
450
+ catch {
451
+ return null;
452
+ }
453
+ }
454
+ function b64(text) {
455
+ return Buffer.from(text).toString('base64url');
456
+ }
457
+ function unb64(text) {
458
+ return Buffer.from(text, 'base64url').toString('utf8');
459
+ }
460
+ function safeEqual(a, b) {
461
+ const x = Buffer.from(a);
462
+ const y = Buffer.from(b);
463
+ return x.length === y.length && timingSafeEqual(x, y);
464
+ }
465
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/oauth/index.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
1
  export { OrgAssetService } from './org-asset-service.js';
2
2
  export { listAllOrgMembers } from './list-all-members.js';
3
+ export { listUserMemberships } from './user-memberships.js';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/organizations/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/organizations/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -2,4 +2,5 @@
2
2
  // belong to neither store alone.
3
3
  export { OrgAssetService } from './org-asset-service.js';
4
4
  export { listAllOrgMembers } from './list-all-members.js';
5
+ export { listUserMemberships } from './user-memberships.js';
5
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/organizations/index.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,iCAAiC;AAEjC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/organizations/index.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,iCAAiC;AAEjC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { IOrgStore, OrgMember, Organization } from '@selvajs/platform';
2
+ /**
3
+ * Every org `userId` belongs to, with their membership row. Reads a page of
4
+ * orgs and the user's rows in it at a time, so the cost grows with the number
5
+ * of orgs, not with the number of members.
6
+ */
7
+ export declare function listUserMemberships(orgs: Pick<IOrgStore, 'listOrgs' | 'getOrgMembersFor'>, userId: string): Promise<{
8
+ org: Organization;
9
+ member: OrgMember;
10
+ }[]>;
11
+ //# sourceMappingURL=user-memberships.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-memberships.d.ts","sourceRoot":"","sources":["../../src/organizations/user-memberships.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAI5E;;;;GAIG;AACH,wBAAsB,mBAAmB,CACxC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,GAAG,kBAAkB,CAAC,EACtD,MAAM,EAAE,MAAM,GACZ,OAAO,CAAC;IAAE,GAAG,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,EAAE,CAAC,CAiBrD"}
@@ -0,0 +1,23 @@
1
+ import { SYSTEM_CONTEXT } from '@selvajs/platform';
2
+ const PAGE = 200;
3
+ /**
4
+ * Every org `userId` belongs to, with their membership row. Reads a page of
5
+ * orgs and the user's rows in it at a time, so the cost grows with the number
6
+ * of orgs, not with the number of members.
7
+ */
8
+ export async function listUserMemberships(orgs, userId) {
9
+ const out = [];
10
+ let cursor;
11
+ do {
12
+ const page = await orgs.listOrgs(SYSTEM_CONTEXT, { limit: PAGE, cursor });
13
+ const members = await orgs.getOrgMembersFor(SYSTEM_CONTEXT, page.items.map((o) => o.id), userId);
14
+ for (const org of page.items) {
15
+ const member = members.get(org.id);
16
+ if (member)
17
+ out.push({ org, member });
18
+ }
19
+ cursor = page.nextCursor;
20
+ } while (cursor);
21
+ return out;
22
+ }
23
+ //# sourceMappingURL=user-memberships.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-memberships.js","sourceRoot":"","sources":["../../src/organizations/user-memberships.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,MAAM,IAAI,GAAG,GAAG,CAAC;AAEjB;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACxC,IAAsD,EACtD,MAAc;IAEd,MAAM,GAAG,GAA+C,EAAE,CAAC;IAC3D,IAAI,MAA0B,CAAC;IAC/B,GAAG,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1E,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAC1C,cAAc,EACd,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAC3B,MAAM,CACN,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACnC,IAAI,MAAM;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QACvC,CAAC;QACD,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;IAC1B,CAAC,QAAQ,MAAM,EAAE;IACjB,OAAO,GAAG,CAAC;AACZ,CAAC"}
@@ -89,6 +89,8 @@ export declare function seedDefinition(h: TestHarness, opts: {
89
89
  ownerId: string;
90
90
  displayName?: string;
91
91
  guid?: string;
92
+ /** The Grasshopper document GUID the extracted schema carries. */
93
+ documentId?: string;
92
94
  }): Promise<SeededDefinition>;
93
95
  export interface SeededShareLink {
94
96
  link: ShareLink;
@@ -150,7 +152,7 @@ export interface CallHandlerOpts {
150
152
  /** Defaults to POST with a body, GET without. */
151
153
  method?: string;
152
154
  /** The options a route passes to `mount`, so scope checks run as they do in production. */
153
- mount?: Pick<RunHandlerOptions, 'action' | 'scopeTarget'>;
155
+ mount?: Pick<RunHandlerOptions, 'action' | 'scopeTarget' | 'anyScope'>;
154
156
  }
155
157
  export interface CallResult {
156
158
  status: number;
@@ -1 +1 @@
1
- {"version":3,"file":"harness.d.ts","sourceRoot":"","sources":["../../src/testing/harness.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"harness.d.ts","sourceRoot":"","sources":["../../src/testing/harness.ts"],"names":[],"mappings":"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"}
@@ -161,7 +161,12 @@ export async function seedDefinition(h, opts) {
161
161
  platformPermissions: ['instance_admin'],
162
162
  orgPermissions: []
163
163
  };
164
- const schema = { name: 'Test', inputs: [], outputs: [] };
164
+ const schema = {
165
+ name: 'Test',
166
+ inputs: [],
167
+ outputs: [],
168
+ ...(opts.documentId && { documentId: opts.documentId })
169
+ };
165
170
  return service.create(ctx, input, file, schema);
166
171
  }
167
172
  /**