@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
@@ -79,7 +79,17 @@ export async function resolveApiToken(request, deps, { pathPrefix = '/api/v1/' }
79
79
  if (!user || user.disabled || !member)
80
80
  return UNAUTHORIZED;
81
81
  const live = await buildRequestContext({ user, platformPermissions, membership: member, pinOrg: true }, { orgs: deps.data.orgs });
82
- if (!canHoldApiTokens(live, deps.mayHoldApiTokens))
82
+ const holds = await canHoldApiTokens(live, token.scopes, {
83
+ policy: deps.mayHoldApiTokens,
84
+ deps: {
85
+ orgs: deps.data.orgs,
86
+ projects: deps.data.projects,
87
+ platformProjectGrants: deps.data.platformProjectGrants,
88
+ definitionMeta: deps.data.definitions,
89
+ flag: deps.flag ?? (() => false)
90
+ }
91
+ });
92
+ if (!holds)
83
93
  return HOLDER_REFUSED;
84
94
  let ctx = narrowApiTokenContext(live, token);
85
95
  // Signed only after the user check above: a minted session can't be
@@ -1 +1 @@
1
- {"version":3,"file":"api-token.js","sourceRoot":"","sources":["../../src/http/api-token.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api-token.js","sourceRoot":"","sources":["../../src/http/api-token.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * SvelteKit's form-submission CSRF check, with the two exemptions it can't
3
+ * express. A host turns the framework's own check off and calls this first.
4
+ *
5
+ * - A Selva API key in `Authorization`: a cross-site form can't set the header,
6
+ * and a `selva_` bearer never falls back to the cookie. API-token uploads are
7
+ * multipart with no `Origin`, which the framework check refuses. Any other
8
+ * `Authorization` (a proxy's id token) still gets checked: the request may run
9
+ * as the cookie session.
10
+ * - `exemptPaths`: endpoints that take a form body from servers, which send no
11
+ * `Origin` (the OAuth token endpoint, per RFC 6749).
12
+ */
13
+ export interface CsrfOptions {
14
+ /** Exact paths that accept cross-site form bodies. */
15
+ exemptPaths?: readonly string[];
16
+ }
17
+ export declare function isCrossSiteFormSubmission(request: Request, options?: CsrfOptions): boolean;
18
+ //# sourceMappingURL=csrf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csrf.d.ts","sourceRoot":"","sources":["../../src/http/csrf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAcH,MAAM,WAAW,WAAW;IAC3B,sDAAsD;IACtD,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAChC;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAS9F"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * SvelteKit's form-submission CSRF check, with the two exemptions it can't
3
+ * express. A host turns the framework's own check off and calls this first.
4
+ *
5
+ * - A Selva API key in `Authorization`: a cross-site form can't set the header,
6
+ * and a `selva_` bearer never falls back to the cookie. API-token uploads are
7
+ * multipart with no `Origin`, which the framework check refuses. Any other
8
+ * `Authorization` (a proxy's id token) still gets checked: the request may run
9
+ * as the cookie session.
10
+ * - `exemptPaths`: endpoints that take a form body from servers, which send no
11
+ * `Origin` (the OAuth token endpoint, per RFC 6749).
12
+ */
13
+ import { API_TOKEN_PREFIX } from '../tokens/index.js';
14
+ const UNSAFE_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);
15
+ // The content types a browser form can send without a CORS preflight, plus
16
+ // SvelteKit's own binary form encoding.
17
+ const FORM_TYPES = [
18
+ 'application/x-www-form-urlencoded',
19
+ 'multipart/form-data',
20
+ 'text/plain',
21
+ 'application/x-sveltekit-formdata'
22
+ ];
23
+ export function isCrossSiteFormSubmission(request, options = {}) {
24
+ if (!UNSAFE_METHODS.has(request.method))
25
+ return false;
26
+ const type = (request.headers.get('content-type') ?? '').split(';')[0].trim().toLowerCase();
27
+ if (!FORM_TYPES.includes(type))
28
+ return false;
29
+ const bearer = /^Bearer\s+(\S+)/i.exec(request.headers.get('authorization') ?? '')?.[1];
30
+ if (bearer?.startsWith(API_TOKEN_PREFIX))
31
+ return false;
32
+ const url = new URL(request.url);
33
+ if (options.exemptPaths?.includes(url.pathname))
34
+ return false;
35
+ return request.headers.get('origin') !== url.origin;
36
+ }
37
+ //# sourceMappingURL=csrf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csrf.js","sourceRoot":"","sources":["../../src/http/csrf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AACnE,2EAA2E;AAC3E,wCAAwC;AACxC,MAAM,UAAU,GAAG;IAClB,mCAAmC;IACnC,qBAAqB;IACrB,YAAY;IACZ,kCAAkC;CAClC,CAAC;AAOF,MAAM,UAAU,yBAAyB,CAAC,OAAgB,EAAE,UAAuB,EAAE;IACpF,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5F,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7C,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxF,IAAI,MAAM,EAAE,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO,KAAK,CAAC;IACvD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9D,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC;AACrD,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export { safeRedirectTarget } from './redirect.js';
2
+ export { isCrossSiteFormSubmission, type CsrfOptions } from './csrf.js';
2
3
  export { declaredBodySizeExceeds, type HeadersLike } from './body-size.js';
3
4
  export { applySecurityHeaders, type SecurityHeaderOptions } from './security-headers.js';
4
5
  export { createRouteClassifier, type RouteClassifier, type RouteClassifierConfig } from './route-classifier.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACzF,OAAO,EACN,qBAAqB,EACrB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACN,sBAAsB,EACtB,oBAAoB,EACpB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,mBAAmB,EAAE,KAAK,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EACN,eAAe,EACf,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACzF,OAAO,EACN,qBAAqB,EACrB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACN,sBAAsB,EACtB,oBAAoB,EACpB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,mBAAmB,EAAE,KAAK,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EACN,eAAe,EACf,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,MAAM,gBAAgB,CAAC"}
@@ -1,5 +1,6 @@
1
1
  // HTTP hardening helpers — transport-agnostic request/response guards.
2
2
  export { safeRedirectTarget } from './redirect.js';
3
+ export { isCrossSiteFormSubmission } from './csrf.js';
3
4
  export { declaredBodySizeExceeds } from './body-size.js';
4
5
  export { applySecurityHeaders } from './security-headers.js';
5
6
  export { createRouteClassifier } from './route-classifier.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAEvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAoB,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAA8B,MAAM,uBAAuB,CAAC;AACzF,OAAO,EACN,qBAAqB,EAGrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACN,sBAAsB,EACtB,oBAAoB,EAGpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,mBAAmB,EAAiC,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EACN,eAAe,EAIf,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAEvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAoB,MAAM,WAAW,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAoB,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAA8B,MAAM,uBAAuB,CAAC;AACzF,OAAO,EACN,qBAAqB,EAGrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACN,sBAAsB,EACtB,oBAAoB,EAGpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,mBAAmB,EAAiC,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EACN,eAAe,EAIf,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,160 @@
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
+ /** The scopes a grant can carry. Each maps to one org-wide API scope. */
17
+ export declare const OAUTH_SCOPES: readonly ["read", "solve", "upload"];
18
+ export type OAuthScope = (typeof OAUTH_SCOPES)[number];
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 declare const REGISTERED_CLIENT_SCOPES: readonly ["read", "solve"];
25
+ /** The Grasshopper plugin's client id. Built in, so it needs no registration and works air-gapped. */
26
+ export declare const GRASSHOPPER_CLIENT_ID = "selva-grasshopper";
27
+ export declare const MCP_PATH = "/mcp";
28
+ export declare class OAuthError extends Error {
29
+ /** RFC 6749 / 7591 error code. */
30
+ readonly error: string;
31
+ readonly status: number;
32
+ constructor(
33
+ /** RFC 6749 / 7591 error code. */
34
+ error: string, description: string, status?: number);
35
+ toBody(): {
36
+ error: string;
37
+ error_description: string;
38
+ };
39
+ }
40
+ export interface OAuthClient {
41
+ clientId: string;
42
+ /** Shown on the consent page. Unverified for a registered client: whatever it claimed. */
43
+ name: string;
44
+ redirectUris: string[];
45
+ /** Shipped with this server, so its name can be trusted. */
46
+ builtIn: boolean;
47
+ /** All this client can be granted, whatever it asks for. */
48
+ scopes: readonly OAuthScope[];
49
+ }
50
+ /** A validated `/oauth/authorize` request, ready for the consent page. */
51
+ export interface AuthorizeRequest {
52
+ client: OAuthClient;
53
+ redirectUri: string;
54
+ state?: string;
55
+ codeChallenge: string;
56
+ scopes: OAuthScope[];
57
+ resource: string;
58
+ }
59
+ /** What the host minted at consent. `secret` is the raw API key. */
60
+ export interface Grant {
61
+ tokenId: string;
62
+ secret: string;
63
+ scopes: OAuthScope[];
64
+ expiresAt: string;
65
+ }
66
+ export interface OAuthServerOptions {
67
+ /** This instance's origin, e.g. `https://selva.example.com`. */
68
+ origin: string;
69
+ /** `SELVA_HMAC_KEY`. Rotating it invalidates registered clients and live codes. */
70
+ secret: string;
71
+ /**
72
+ * Fetches a Client ID Metadata Document. The URL comes from an unknown client,
73
+ * so the host must guard it against SSRF. Without it, URL client ids are refused.
74
+ */
75
+ fetchClientMetadata?: (url: string) => Promise<unknown>;
76
+ /**
77
+ * Redeemed code hashes and their expiry. Pass one map for the process so a
78
+ * rebuilt server (a new origin, a rotated secret) still refuses a replay.
79
+ */
80
+ redeemedCodes?: Map<string, number>;
81
+ now?: () => number;
82
+ }
83
+ interface HttpResult {
84
+ status: number;
85
+ body: Record<string, unknown>;
86
+ }
87
+ export declare function mcpResourceUrl(origin: string): string;
88
+ export declare function resourceMetadataUrl(origin: string): string;
89
+ /** RFC 9728. Claude uses only the first authorization server. */
90
+ export declare function protectedResourceMetadata(origin: string): {
91
+ resource: string;
92
+ authorization_servers: string[];
93
+ scopes_supported: ("read" | "solve")[];
94
+ bearer_methods_supported: string[];
95
+ };
96
+ /**
97
+ * RFC 8414. Claude picks Client ID Metadata Documents only when both
98
+ * `client_id_metadata_document_supported` and the `none` auth method appear.
99
+ */
100
+ export declare function authorizationServerMetadata(origin: string): {
101
+ issuer: string;
102
+ authorization_endpoint: string;
103
+ token_endpoint: string;
104
+ registration_endpoint: string;
105
+ response_types_supported: string[];
106
+ grant_types_supported: string[];
107
+ code_challenge_methods_supported: string[];
108
+ token_endpoint_auth_methods_supported: string[];
109
+ scopes_supported: ("read" | "solve" | "upload")[];
110
+ client_id_metadata_document_supported: boolean;
111
+ authorization_response_iss_parameter_supported: boolean;
112
+ };
113
+ export declare function createOAuthServer(options: OAuthServerOptions): {
114
+ register: (input: unknown) => HttpResult;
115
+ resolveClient: (clientId: string) => Promise<OAuthClient>;
116
+ parseAuthorizeRequest: (query: URLSearchParams) => Promise<AuthorizeRequest>;
117
+ approve: (request: AuthorizeRequest, grant: Grant) => string;
118
+ deny: (request: AuthorizeRequest) => string;
119
+ exchange: (form: URLSearchParams) => HttpResult;
120
+ protectedResourceMetadata: () => {
121
+ resource: string;
122
+ authorization_servers: string[];
123
+ scopes_supported: ("read" | "solve")[];
124
+ bearer_methods_supported: string[];
125
+ };
126
+ authorizationServerMetadata: () => {
127
+ issuer: string;
128
+ authorization_endpoint: string;
129
+ token_endpoint: string;
130
+ registration_endpoint: string;
131
+ response_types_supported: string[];
132
+ grant_types_supported: string[];
133
+ code_challenge_methods_supported: string[];
134
+ token_endpoint_auth_methods_supported: string[];
135
+ scopes_supported: ("read" | "solve" | "upload")[];
136
+ client_id_metadata_document_supported: boolean;
137
+ authorization_response_iss_parameter_supported: boolean;
138
+ };
139
+ };
140
+ export type OAuthServer = ReturnType<typeof createOAuthServer>;
141
+ /** OAuth scopes to the API scopes a minted token gets. */
142
+ export declare function apiScopesFor(scopes: readonly OAuthScope[]): string[];
143
+ /** One access level a consent page offers, and the scopes approving it grants. */
144
+ export interface ConsentChoice {
145
+ access: 'read' | 'solve' | 'upload';
146
+ scopes: OAuthScope[];
147
+ }
148
+ /**
149
+ * The access levels a consent page offers for a request, narrowest first. The
150
+ * user may narrow what the client asked for, never widen it. An upload request
151
+ * is offered as asked: narrowing it to read would leave the client unable to
152
+ * do the one thing it signed in for.
153
+ */
154
+ export declare function consentChoices(scopes: readonly OAuthScope[]): ConsentChoice[];
155
+ /** A redirect to a program on the user's own machine, which any local process can claim. */
156
+ export declare function isLoopbackRedirect(uri: string): boolean;
157
+ /** Exact, except a loopback redirect matches on any port (RFC 8252 §7.3). */
158
+ export declare function redirectMatches(registered: string, requested: string): boolean;
159
+ export {};
160
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/oauth/index.ts"],"names":[],"mappings":"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"}