rivet-design 0.10.7 → 0.10.9

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 (170) hide show
  1. package/dist/index.d.ts +54 -3
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +302 -129
  4. package/dist/index.js.map +1 -1
  5. package/dist/mcp/agent-variants/SessionStore.d.ts +23 -1
  6. package/dist/mcp/agent-variants/SessionStore.d.ts.map +1 -1
  7. package/dist/mcp/agent-variants/SessionStore.js +42 -0
  8. package/dist/mcp/agent-variants/SessionStore.js.map +1 -1
  9. package/dist/mcp/agent-variants/WorktreeOrchestrator.d.ts +99 -2
  10. package/dist/mcp/agent-variants/WorktreeOrchestrator.d.ts.map +1 -1
  11. package/dist/mcp/agent-variants/WorktreeOrchestrator.js +734 -74
  12. package/dist/mcp/agent-variants/WorktreeOrchestrator.js.map +1 -1
  13. package/dist/mcp/agent-variants/WorktreeOrchestrator.testHelpers.d.ts +8 -2
  14. package/dist/mcp/agent-variants/WorktreeOrchestrator.testHelpers.d.ts.map +1 -1
  15. package/dist/mcp/agent-variants/WorktreeOrchestrator.testHelpers.js +24 -5
  16. package/dist/mcp/agent-variants/WorktreeOrchestrator.testHelpers.js.map +1 -1
  17. package/dist/mcp/agent-variants/contracts.d.ts +1175 -233
  18. package/dist/mcp/agent-variants/contracts.d.ts.map +1 -1
  19. package/dist/mcp/agent-variants/contracts.js +12 -4
  20. package/dist/mcp/agent-variants/contracts.js.map +1 -1
  21. package/dist/mcp/agent-variants/designCritique.d.ts +163 -0
  22. package/dist/mcp/agent-variants/designCritique.d.ts.map +1 -0
  23. package/dist/mcp/agent-variants/designCritique.js +710 -0
  24. package/dist/mcp/agent-variants/designCritique.js.map +1 -0
  25. package/dist/mcp/agent-variants/diffQa.d.ts +7 -0
  26. package/dist/mcp/agent-variants/diffQa.d.ts.map +1 -0
  27. package/dist/mcp/agent-variants/diffQa.js +67 -0
  28. package/dist/mcp/agent-variants/diffQa.js.map +1 -0
  29. package/dist/mcp/agent-variants/index.d.ts +2 -2
  30. package/dist/mcp/agent-variants/index.d.ts.map +1 -1
  31. package/dist/mcp/agent-variants/index.js +2 -1
  32. package/dist/mcp/agent-variants/index.js.map +1 -1
  33. package/dist/mcp/agent-variants/pinterestSourceContext.d.ts.map +1 -1
  34. package/dist/mcp/agent-variants/pinterestSourceContext.js +11 -1
  35. package/dist/mcp/agent-variants/pinterestSourceContext.js.map +1 -1
  36. package/dist/mcp/agent-variants/previewQa.d.ts.map +1 -1
  37. package/dist/mcp/agent-variants/previewQa.js +7 -0
  38. package/dist/mcp/agent-variants/previewQa.js.map +1 -1
  39. package/dist/mcp/agent-variants/tools.d.ts.map +1 -1
  40. package/dist/mcp/agent-variants/tools.js +15 -5
  41. package/dist/mcp/agent-variants/tools.js.map +1 -1
  42. package/dist/mcp/auth/httpOAuthProvider.d.ts +103 -0
  43. package/dist/mcp/auth/httpOAuthProvider.d.ts.map +1 -0
  44. package/dist/mcp/auth/httpOAuthProvider.js +454 -0
  45. package/dist/mcp/auth/httpOAuthProvider.js.map +1 -0
  46. package/dist/mcp/auth/tools.d.ts +2 -0
  47. package/dist/mcp/auth/tools.d.ts.map +1 -1
  48. package/dist/mcp/auth/tools.js +12 -5
  49. package/dist/mcp/auth/tools.js.map +1 -1
  50. package/dist/mcp/httpServer.d.ts +36 -0
  51. package/dist/mcp/httpServer.d.ts.map +1 -0
  52. package/dist/mcp/httpServer.js +307 -0
  53. package/dist/mcp/httpServer.js.map +1 -0
  54. package/dist/mcp/server.d.ts +17 -0
  55. package/dist/mcp/server.d.ts.map +1 -1
  56. package/dist/mcp/server.js +50 -29
  57. package/dist/mcp/server.js.map +1 -1
  58. package/dist/proxy-middleware/proxy-config.d.ts.map +1 -1
  59. package/dist/proxy-middleware/proxy-config.js +5 -2
  60. package/dist/proxy-middleware/proxy-config.js.map +1 -1
  61. package/dist/routes/agentVariants.d.ts +2 -1
  62. package/dist/routes/agentVariants.d.ts.map +1 -1
  63. package/dist/routes/agentVariants.js +268 -19
  64. package/dist/routes/agentVariants.js.map +1 -1
  65. package/dist/routes/design.d.ts.map +1 -1
  66. package/dist/routes/design.js +0 -122
  67. package/dist/routes/design.js.map +1 -1
  68. package/dist/routes/mcp.d.ts.map +1 -1
  69. package/dist/routes/mcp.js +2 -1
  70. package/dist/routes/mcp.js.map +1 -1
  71. package/dist/server.d.ts +15 -0
  72. package/dist/server.d.ts.map +1 -1
  73. package/dist/server.js +24 -11
  74. package/dist/server.js.map +1 -1
  75. package/dist/services/AgentSessionService.d.ts +5 -1
  76. package/dist/services/AgentSessionService.d.ts.map +1 -1
  77. package/dist/services/AgentSessionService.js +11 -4
  78. package/dist/services/AgentSessionService.js.map +1 -1
  79. package/dist/services/AuthService.d.ts +1 -0
  80. package/dist/services/AuthService.d.ts.map +1 -1
  81. package/dist/services/AuthService.js +11 -1
  82. package/dist/services/AuthService.js.map +1 -1
  83. package/dist/services/ConfigManager.d.ts +5 -0
  84. package/dist/services/ConfigManager.d.ts.map +1 -1
  85. package/dist/services/ConfigManager.js +25 -3
  86. package/dist/services/ConfigManager.js.map +1 -1
  87. package/dist/services/DevServerRuntimeService.d.ts +119 -0
  88. package/dist/services/DevServerRuntimeService.d.ts.map +1 -0
  89. package/dist/services/DevServerRuntimeService.js +657 -0
  90. package/dist/services/DevServerRuntimeService.js.map +1 -0
  91. package/dist/services/GatewayClient.d.ts +25 -0
  92. package/dist/services/GatewayClient.d.ts.map +1 -1
  93. package/dist/services/GatewayClient.js +70 -11
  94. package/dist/services/GatewayClient.js.map +1 -1
  95. package/dist/services/InlineVariantGenerationService.d.ts +2 -3
  96. package/dist/services/InlineVariantGenerationService.d.ts.map +1 -1
  97. package/dist/services/InlineVariantGenerationService.js +7 -5
  98. package/dist/services/InlineVariantGenerationService.js.map +1 -1
  99. package/dist/services/IntegrationsClient.d.ts +20 -0
  100. package/dist/services/IntegrationsClient.d.ts.map +1 -1
  101. package/dist/services/IntegrationsClient.js +82 -24
  102. package/dist/services/IntegrationsClient.js.map +1 -1
  103. package/dist/services/RequestAuthContext.d.ts +7 -1
  104. package/dist/services/RequestAuthContext.d.ts.map +1 -1
  105. package/dist/services/RequestAuthContext.js +15 -2
  106. package/dist/services/RequestAuthContext.js.map +1 -1
  107. package/dist/services/SessionBridgeService.d.ts +1 -0
  108. package/dist/services/SessionBridgeService.d.ts.map +1 -1
  109. package/dist/services/SessionBridgeService.js +16 -1
  110. package/dist/services/SessionBridgeService.js.map +1 -1
  111. package/dist/services/TelemetryService.d.ts +2 -0
  112. package/dist/services/TelemetryService.d.ts.map +1 -1
  113. package/dist/services/TelemetryService.js +2 -0
  114. package/dist/services/TelemetryService.js.map +1 -1
  115. package/dist/services/VariantHistoryService.d.ts +8 -0
  116. package/dist/services/VariantHistoryService.d.ts.map +1 -1
  117. package/dist/services/VariantHistoryService.js +23 -0
  118. package/dist/services/VariantHistoryService.js.map +1 -1
  119. package/dist/services/VariantRunService.d.ts +56 -0
  120. package/dist/services/VariantRunService.d.ts.map +1 -0
  121. package/dist/services/VariantRunService.js +56 -0
  122. package/dist/services/VariantRunService.js.map +1 -0
  123. package/dist/services/VariantsRuntime.d.ts +22 -0
  124. package/dist/services/VariantsRuntime.d.ts.map +1 -0
  125. package/dist/services/VariantsRuntime.js +32 -0
  126. package/dist/services/VariantsRuntime.js.map +1 -0
  127. package/dist/services/VisualVariantAgentRunner.d.ts +20 -0
  128. package/dist/services/VisualVariantAgentRunner.d.ts.map +1 -0
  129. package/dist/services/VisualVariantAgentRunner.js +66 -0
  130. package/dist/services/VisualVariantAgentRunner.js.map +1 -0
  131. package/dist/services/WorktreeManager.d.ts +34 -0
  132. package/dist/services/WorktreeManager.d.ts.map +1 -1
  133. package/dist/services/WorktreeManager.js +172 -23
  134. package/dist/services/WorktreeManager.js.map +1 -1
  135. package/dist/services/createAgentVariantsOrchestrator.d.ts.map +1 -1
  136. package/dist/services/createAgentVariantsOrchestrator.js +9 -0
  137. package/dist/services/createAgentVariantsOrchestrator.js.map +1 -1
  138. package/dist/utils/devServerCommand.d.ts +11 -4
  139. package/dist/utils/devServerCommand.d.ts.map +1 -1
  140. package/dist/utils/devServerCommand.js +17 -8
  141. package/dist/utils/devServerCommand.js.map +1 -1
  142. package/dist/utils/devServerError.d.ts +34 -0
  143. package/dist/utils/devServerError.d.ts.map +1 -0
  144. package/dist/utils/devServerError.js +39 -0
  145. package/dist/utils/devServerError.js.map +1 -0
  146. package/dist/utils/elementRefToContext.d.ts +4 -0
  147. package/dist/utils/elementRefToContext.d.ts.map +1 -0
  148. package/dist/utils/elementRefToContext.js +63 -0
  149. package/dist/utils/elementRefToContext.js.map +1 -0
  150. package/dist/utils/skills/shared-variants-protocol.d.ts.map +1 -1
  151. package/dist/utils/skills/shared-variants-protocol.js +5 -2
  152. package/dist/utils/skills/shared-variants-protocol.js.map +1 -1
  153. package/dist/utils/variantSessionStart.d.ts +3 -0
  154. package/dist/utils/variantSessionStart.d.ts.map +1 -0
  155. package/dist/utils/variantSessionStart.js +7 -0
  156. package/dist/utils/variantSessionStart.js.map +1 -0
  157. package/package.json +3 -1
  158. package/src/ui/dist/assets/main-Cwwhwfjq.js +645 -0
  159. package/src/ui/dist/assets/main-Do6whVIm.css +1 -0
  160. package/src/ui/dist/index.html +2 -2
  161. package/dist/services/CommentVariationService.d.ts +0 -34
  162. package/dist/services/CommentVariationService.d.ts.map +0 -1
  163. package/dist/services/CommentVariationService.js +0 -136
  164. package/dist/services/CommentVariationService.js.map +0 -1
  165. package/dist/services/VariantCodeGeneratorService.d.ts +0 -39
  166. package/dist/services/VariantCodeGeneratorService.d.ts.map +0 -1
  167. package/dist/services/VariantCodeGeneratorService.js +0 -109
  168. package/dist/services/VariantCodeGeneratorService.js.map +0 -1
  169. package/src/ui/dist/assets/main-DUIrSkV3.css +0 -1
  170. package/src/ui/dist/assets/main-DYpxGvCu.js +0 -646
@@ -0,0 +1,103 @@
1
+ import type { Response } from 'express';
2
+ import type { OAuthServerProvider, AuthorizationParams } from '@modelcontextprotocol/sdk/server/auth/provider.js';
3
+ import type { OAuthRegisteredClientsStore } from '@modelcontextprotocol/sdk/server/auth/clients.js';
4
+ import type { OAuthClientInformationFull, OAuthTokens } from '@modelcontextprotocol/sdk/shared/auth.js';
5
+ import type { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js';
6
+ /** Rivet credentials issued by the proxy after a completed browser login. */
7
+ export type PersistedRivetTokens = {
8
+ token: string;
9
+ refreshToken?: string;
10
+ user?: {
11
+ id: string;
12
+ email: string;
13
+ };
14
+ };
15
+ export type RivetOAuthProviderOptions = {
16
+ /** Base URL of the Rivet proxy (auth backend), e.g. https://rivet-proxy.onrender.com */
17
+ proxyUrl: string;
18
+ /**
19
+ * Public URL of the local OAuth browser callback page. Must be a bare
20
+ * localhost origin (no path) — the proxy rejects custom redirect paths.
21
+ */
22
+ callbackUrl: string;
23
+ /** The MCP client (`--editor`), recorded with the login for analytics. */
24
+ mcpEditor?: string;
25
+ /** Persists tokens locally after login (e.g. ConfigManager.setAuth). */
26
+ persistTokens?: (tokens: PersistedRivetTokens) => void;
27
+ /** Confirms a refresh token is still accepted by durable local auth state. */
28
+ isRefreshTokenCurrent?: (refreshToken: string) => boolean;
29
+ fetchImpl?: typeof fetch;
30
+ /** Test override for the proxy token polling interval. */
31
+ pollIntervalMs?: number;
32
+ };
33
+ /** In-memory dynamic client registration store (clients are ephemeral). */
34
+ declare class InMemoryClientsStore implements OAuthRegisteredClientsStore {
35
+ private clients;
36
+ getClient(clientId: string): OAuthClientInformationFull | undefined;
37
+ registerClient(client: Omit<OAuthClientInformationFull, 'client_id' | 'client_id_issued_at'> & Partial<Pick<OAuthClientInformationFull, 'client_id' | 'client_id_issued_at'>>): OAuthClientInformationFull;
38
+ }
39
+ /**
40
+ * OAuth authorization server provider that bridges the MCP OAuth spec
41
+ * (authorization code + PKCE, dynamic client registration) onto the existing
42
+ * Rivet proxy Google login flow:
43
+ *
44
+ * 1. `authorize` starts a proxy Google login with this server's local
45
+ * callback page as the redirect origin and sends the browser to Google.
46
+ * 2. The browser returns to the local callback page, which forwards the
47
+ * Supabase hash tokens to `completeBrowserCallback`. That completes the
48
+ * proxy login, obtains the Rivet access token, and mints a single-use
49
+ * authorization code bound to the client's PKCE challenge.
50
+ * 3. `exchangeAuthorizationCode` returns the Rivet access token as the OAuth
51
+ * access token; `verifyAccessToken` validates bearer tokens against the
52
+ * proxy profile endpoint.
53
+ */
54
+ export declare class RivetOAuthServerProvider implements OAuthServerProvider {
55
+ readonly clientsStore: InMemoryClientsStore;
56
+ private readonly proxyUrl;
57
+ private readonly callbackUrl;
58
+ private readonly mcpEditor?;
59
+ private readonly persistTokens?;
60
+ private readonly isRefreshTokenCurrent?;
61
+ private readonly fetchFn;
62
+ private readonly pollIntervalMs;
63
+ private readonly pendingAuthorizations;
64
+ private readonly authorizationCodes;
65
+ private readonly issuedBearerTokens;
66
+ private readonly verifiedTokens;
67
+ private readonly revokedAccessTokens;
68
+ private readonly revokedRefreshTokens;
69
+ private readonly activeRefreshTokens;
70
+ constructor(options: RivetOAuthProviderOptions);
71
+ authorize(client: OAuthClientInformationFull, params: AuthorizationParams, res: Response): Promise<void>;
72
+ /**
73
+ * Completes a browser login forwarded by the local OAuth callback page:
74
+ * finishes the proxy login session, obtains Rivet credentials, mints a
75
+ * single-use authorization code, and returns the MCP client redirect URL.
76
+ */
77
+ completeBrowserCallback(input: {
78
+ sessionId?: string;
79
+ accessToken?: string;
80
+ refreshToken?: string;
81
+ }): Promise<{
82
+ redirectUrl: string;
83
+ }>;
84
+ challengeForAuthorizationCode(client: OAuthClientInformationFull, authorizationCode: string): Promise<string>;
85
+ exchangeAuthorizationCode(client: OAuthClientInformationFull, authorizationCode: string, _codeVerifier?: string, redirectUri?: string): Promise<OAuthTokens>;
86
+ exchangeRefreshToken(_client: OAuthClientInformationFull, refreshToken: string): Promise<OAuthTokens>;
87
+ verifyAccessToken(token: string): Promise<AuthInfo>;
88
+ /**
89
+ * Invalidates a bearer token issued by this OAuth provider and its paired
90
+ * refresh token, if the provider knows one.
91
+ */
92
+ revokeAccessToken(token: string): void;
93
+ private rememberIssuedBearerToken;
94
+ private getValidCodeEntry;
95
+ private toOAuthTokens;
96
+ private pollForRivetTokens;
97
+ private prunePendingAuthorizations;
98
+ private pruneAuthorizationCodes;
99
+ private pruneVerifiedTokens;
100
+ private pruneIssuedBearerTokens;
101
+ }
102
+ export {};
103
+ //# sourceMappingURL=httpOAuthProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpOAuthProvider.d.ts","sourceRoot":"","sources":["../../../src/mcp/auth/httpOAuthProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,454 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RivetOAuthServerProvider = void 0;
4
+ const crypto_1 = require("crypto");
5
+ const errors_js_1 = require("@modelcontextprotocol/sdk/server/auth/errors.js");
6
+ const accessTokenRefresh_1 = require("../../services/accessTokenRefresh");
7
+ const telemetry_1 = require("../../config/telemetry");
8
+ const logger_1 = require("../../utils/logger");
9
+ const log = (0, logger_1.createLogger)('mcp-http-oauth');
10
+ const AUTH_CODE_TTL_MS = 10 * 60_000;
11
+ const PENDING_AUTH_TTL_MS = 10 * 60_000;
12
+ const TOKEN_VERIFY_CACHE_TTL_MS = 60_000;
13
+ const DEFAULT_TOKEN_TTL_SECONDS = 3600;
14
+ const TOKEN_POLL_MAX_ATTEMPTS = 120;
15
+ const TOKEN_POLL_INTERVAL_MS = 1000;
16
+ const PROFILE_FETCH_TIMEOUT_MS = 10_000;
17
+ const MCP_OAUTH_SCOPE = 'rivet';
18
+ const HOSTED_DASHBOARD_AUTH_URL = 'https://rivet-proxy.onrender.com/dashboard/';
19
+ const LOOPBACK_REDIRECT_HOSTS = new Set([
20
+ 'localhost',
21
+ '127.0.0.1',
22
+ '::1',
23
+ '[::1]',
24
+ ]);
25
+ /** In-memory dynamic client registration store (clients are ephemeral). */
26
+ class InMemoryClientsStore {
27
+ clients = new Map();
28
+ getClient(clientId) {
29
+ return this.clients.get(clientId);
30
+ }
31
+ registerClient(client) {
32
+ if (!client.redirect_uris.every(isLoopbackRedirectUri)) {
33
+ throw new errors_js_1.InvalidClientMetadataError('Rivet MCP OAuth clients must use loopback HTTP redirect URIs.');
34
+ }
35
+ const registered = {
36
+ ...client,
37
+ client_id: client.client_id ?? (0, crypto_1.randomUUID)(),
38
+ client_id_issued_at: client.client_id_issued_at ?? Math.floor(Date.now() / 1000),
39
+ };
40
+ this.clients.set(registered.client_id, registered);
41
+ return registered;
42
+ }
43
+ }
44
+ const isLoopbackRedirectUri = (redirectUri) => {
45
+ try {
46
+ const url = new URL(redirectUri);
47
+ return (url.protocol === 'http:' && LOOPBACK_REDIRECT_HOSTS.has(url.hostname));
48
+ }
49
+ catch {
50
+ return false;
51
+ }
52
+ };
53
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
54
+ const escapeHtml = (value) => value
55
+ .replace(/&/g, '&amp;')
56
+ .replace(/</g, '&lt;')
57
+ .replace(/>/g, '&gt;')
58
+ .replace(/"/g, '&quot;')
59
+ .replace(/'/g, '&#39;');
60
+ /**
61
+ * Shows the browser user which local OAuth client will receive the code before
62
+ * starting Google sign-in.
63
+ */
64
+ const getClientApprovalHtml = (input) => {
65
+ const clientName = input.clientName?.trim() || 'Unknown MCP client';
66
+ return `<!doctype html>
67
+ <html>
68
+ <head>
69
+ <meta charset="utf-8" />
70
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
71
+ <title>Approve Rivet MCP sign in</title>
72
+ <style>
73
+ body {
74
+ margin: 0;
75
+ min-height: 100vh;
76
+ display: grid;
77
+ place-items: center;
78
+ font-family: system-ui, sans-serif;
79
+ background: #0b0b0f;
80
+ color: #fff;
81
+ }
82
+ main {
83
+ max-width: 480px;
84
+ padding: 32px;
85
+ }
86
+ code {
87
+ word-break: break-all;
88
+ }
89
+ a {
90
+ display: inline-block;
91
+ margin-top: 20px;
92
+ padding: 10px 14px;
93
+ border-radius: 8px;
94
+ background: #fff;
95
+ color: #0b0b0f;
96
+ text-decoration: none;
97
+ font-weight: 600;
98
+ }
99
+ </style>
100
+ </head>
101
+ <body>
102
+ <main>
103
+ <h1>Approve Rivet MCP sign in</h1>
104
+ <p><strong>${escapeHtml(clientName)}</strong> wants to connect to Rivet.</p>
105
+ <p>After sign-in, Rivet will return an OAuth code to:</p>
106
+ <p><code>${escapeHtml(input.redirectUri)}</code></p>
107
+ <a href="${escapeHtml(input.authUrl)}">Continue to Rivet sign in</a>
108
+ </main>
109
+ </body>
110
+ </html>`;
111
+ };
112
+ const getTokenExpiryMs = (token) => {
113
+ const secondsUntilExpiry = (0, accessTokenRefresh_1.getJwtSecondsUntilExpiry)(token) ?? DEFAULT_TOKEN_TTL_SECONDS;
114
+ return Date.now() + Math.max(secondsUntilExpiry, 1) * 1000;
115
+ };
116
+ const normalizeProfileUser = (user) => {
117
+ if (typeof user?.id !== 'string' || typeof user.email !== 'string') {
118
+ return undefined;
119
+ }
120
+ return { id: user.id, email: user.email };
121
+ };
122
+ /**
123
+ * OAuth authorization server provider that bridges the MCP OAuth spec
124
+ * (authorization code + PKCE, dynamic client registration) onto the existing
125
+ * Rivet proxy Google login flow:
126
+ *
127
+ * 1. `authorize` starts a proxy Google login with this server's local
128
+ * callback page as the redirect origin and sends the browser to Google.
129
+ * 2. The browser returns to the local callback page, which forwards the
130
+ * Supabase hash tokens to `completeBrowserCallback`. That completes the
131
+ * proxy login, obtains the Rivet access token, and mints a single-use
132
+ * authorization code bound to the client's PKCE challenge.
133
+ * 3. `exchangeAuthorizationCode` returns the Rivet access token as the OAuth
134
+ * access token; `verifyAccessToken` validates bearer tokens against the
135
+ * proxy profile endpoint.
136
+ */
137
+ class RivetOAuthServerProvider {
138
+ clientsStore = new InMemoryClientsStore();
139
+ proxyUrl;
140
+ callbackUrl;
141
+ mcpEditor;
142
+ persistTokens;
143
+ isRefreshTokenCurrent;
144
+ fetchFn;
145
+ pollIntervalMs;
146
+ pendingAuthorizations = new Map();
147
+ authorizationCodes = new Map();
148
+ issuedBearerTokens = new Map();
149
+ verifiedTokens = new Map();
150
+ revokedAccessTokens = new Set();
151
+ revokedRefreshTokens = new Set();
152
+ activeRefreshTokens = new Set();
153
+ constructor(options) {
154
+ this.proxyUrl = options.proxyUrl.replace(/\/$/, '');
155
+ this.callbackUrl = options.callbackUrl;
156
+ this.mcpEditor = options.mcpEditor;
157
+ this.persistTokens = options.persistTokens;
158
+ this.isRefreshTokenCurrent = options.isRefreshTokenCurrent;
159
+ this.fetchFn = options.fetchImpl ?? fetch;
160
+ this.pollIntervalMs = options.pollIntervalMs ?? TOKEN_POLL_INTERVAL_MS;
161
+ }
162
+ async authorize(client, params, res) {
163
+ const response = await this.fetchFn(`${this.proxyUrl}/api/auth/google/start`, {
164
+ method: 'POST',
165
+ headers: { 'Content-Type': 'application/json' },
166
+ body: JSON.stringify({
167
+ redirectOrigin: this.callbackUrl,
168
+ authDestination: HOSTED_DASHBOARD_AUTH_URL,
169
+ source: 'mcp',
170
+ editor: this.mcpEditor,
171
+ version: telemetry_1.RIVET_VERSION,
172
+ }),
173
+ });
174
+ const result = (await response.json().catch(() => null));
175
+ if (!response.ok ||
176
+ !result?.success ||
177
+ !result.authUrl ||
178
+ !result.sessionId ||
179
+ !result.pollSecret ||
180
+ !result.completionSecret) {
181
+ log.warn('Proxy login start failed', { status: response.status });
182
+ throw new errors_js_1.ServerError('Failed to start Rivet sign-in');
183
+ }
184
+ this.prunePendingAuthorizations();
185
+ this.pendingAuthorizations.set(result.sessionId, {
186
+ client,
187
+ params,
188
+ pollSecret: result.pollSecret,
189
+ completionSecret: result.completionSecret,
190
+ expiresAt: Date.now() + PENDING_AUTH_TTL_MS,
191
+ });
192
+ res.status(200).type('html').send(getClientApprovalHtml({
193
+ authUrl: result.authUrl,
194
+ clientName: client.client_name,
195
+ redirectUri: params.redirectUri,
196
+ }));
197
+ }
198
+ /**
199
+ * Completes a browser login forwarded by the local OAuth callback page:
200
+ * finishes the proxy login session, obtains Rivet credentials, mints a
201
+ * single-use authorization code, and returns the MCP client redirect URL.
202
+ */
203
+ async completeBrowserCallback(input) {
204
+ const { sessionId, accessToken, refreshToken } = input;
205
+ if (!sessionId || !accessToken) {
206
+ throw new Error('OAuth callback missing session or token');
207
+ }
208
+ const pending = this.pendingAuthorizations.get(sessionId);
209
+ this.pendingAuthorizations.delete(sessionId);
210
+ if (!pending || pending.expiresAt < Date.now()) {
211
+ throw new Error('Unknown or expired sign-in session');
212
+ }
213
+ const completeResponse = await this.fetchFn(`${this.proxyUrl}/api/auth/google/complete`, {
214
+ method: 'POST',
215
+ headers: { 'Content-Type': 'application/json' },
216
+ body: JSON.stringify({
217
+ sessionId,
218
+ accessToken,
219
+ refreshToken,
220
+ completionSecret: pending.completionSecret,
221
+ }),
222
+ });
223
+ const completeResult = (await completeResponse.json().catch(() => null));
224
+ if (!completeResponse.ok || !completeResult?.success) {
225
+ throw new Error(completeResult?.error ?? 'Rivet sign-in completion failed');
226
+ }
227
+ const tokens = await this.pollForRivetTokens(sessionId, pending.pollSecret);
228
+ try {
229
+ this.persistTokens?.(tokens);
230
+ }
231
+ catch (error) {
232
+ log.warn('Failed to persist Rivet tokens after MCP OAuth login:', error);
233
+ }
234
+ const code = (0, crypto_1.randomBytes)(32).toString('base64url');
235
+ this.pruneAuthorizationCodes();
236
+ this.authorizationCodes.set(code, {
237
+ clientId: pending.client.client_id,
238
+ codeChallenge: pending.params.codeChallenge,
239
+ redirectUri: pending.params.redirectUri,
240
+ accessToken: tokens.token,
241
+ refreshToken: tokens.refreshToken,
242
+ user: tokens.user,
243
+ expiresAt: Date.now() + AUTH_CODE_TTL_MS,
244
+ });
245
+ const redirectUrl = new URL(pending.params.redirectUri);
246
+ redirectUrl.searchParams.set('code', code);
247
+ if (pending.params.state) {
248
+ redirectUrl.searchParams.set('state', pending.params.state);
249
+ }
250
+ return { redirectUrl: redirectUrl.toString() };
251
+ }
252
+ async challengeForAuthorizationCode(client, authorizationCode) {
253
+ const entry = this.getValidCodeEntry(client, authorizationCode);
254
+ return entry.codeChallenge;
255
+ }
256
+ async exchangeAuthorizationCode(client, authorizationCode, _codeVerifier, redirectUri) {
257
+ const entry = this.getValidCodeEntry(client, authorizationCode);
258
+ if (redirectUri && entry.redirectUri !== redirectUri) {
259
+ throw new errors_js_1.InvalidGrantError('redirect_uri does not match');
260
+ }
261
+ this.authorizationCodes.delete(authorizationCode);
262
+ this.rememberIssuedBearerToken({
263
+ token: entry.accessToken,
264
+ refreshToken: entry.refreshToken,
265
+ user: entry.user,
266
+ });
267
+ return this.toOAuthTokens(entry.accessToken, entry.refreshToken);
268
+ }
269
+ async exchangeRefreshToken(_client, refreshToken) {
270
+ if (this.revokedRefreshTokens.has(refreshToken) ||
271
+ !this.activeRefreshTokens.has(refreshToken) ||
272
+ this.isRefreshTokenCurrent?.(refreshToken) === false) {
273
+ throw new errors_js_1.InvalidGrantError('Refresh token was revoked');
274
+ }
275
+ const refreshed = await (0, accessTokenRefresh_1.refreshAccessTokenViaProxy)({
276
+ refreshToken,
277
+ proxyUrl: this.proxyUrl,
278
+ fetchImpl: this.fetchFn,
279
+ });
280
+ if (!refreshed) {
281
+ throw new errors_js_1.InvalidGrantError('Refresh token was rejected');
282
+ }
283
+ const nextRefreshToken = refreshed.refreshToken ?? refreshToken;
284
+ try {
285
+ this.persistTokens?.({
286
+ token: refreshed.token,
287
+ refreshToken: nextRefreshToken,
288
+ });
289
+ }
290
+ catch (error) {
291
+ log.warn('Failed to persist refreshed Rivet tokens:', error);
292
+ }
293
+ this.activeRefreshTokens.delete(refreshToken);
294
+ this.rememberIssuedBearerToken({
295
+ token: refreshed.token,
296
+ refreshToken: nextRefreshToken,
297
+ });
298
+ return this.toOAuthTokens(refreshed.token, nextRefreshToken);
299
+ }
300
+ async verifyAccessToken(token) {
301
+ if (this.revokedAccessTokens.has(token)) {
302
+ this.verifiedTokens.delete(token);
303
+ throw new errors_js_1.InvalidTokenError('Access token was revoked');
304
+ }
305
+ const cached = this.verifiedTokens.get(token);
306
+ if (cached && cached.cachedUntil > Date.now()) {
307
+ return cached.authInfo;
308
+ }
309
+ let response;
310
+ try {
311
+ response = await this.fetchFn(`${this.proxyUrl}/api/user/profile`, {
312
+ method: 'GET',
313
+ headers: {
314
+ 'Content-Type': 'application/json',
315
+ Authorization: `Bearer ${token}`,
316
+ },
317
+ signal: AbortSignal.timeout(PROFILE_FETCH_TIMEOUT_MS),
318
+ });
319
+ }
320
+ catch (error) {
321
+ log.warn('Token verification request failed:', error);
322
+ throw new errors_js_1.ServerError('Could not reach the Rivet auth server');
323
+ }
324
+ const result = (await response.json().catch(() => null));
325
+ if (!response.ok || !result?.success) {
326
+ this.verifiedTokens.delete(token);
327
+ throw new errors_js_1.InvalidTokenError('Rivet rejected the access token');
328
+ }
329
+ this.pruneIssuedBearerTokens();
330
+ const issuedToken = this.issuedBearerTokens.get(token);
331
+ const user = normalizeProfileUser(result.user) ?? issuedToken?.user;
332
+ const secondsUntilExpiry = (0, accessTokenRefresh_1.getJwtSecondsUntilExpiry)(token) ?? DEFAULT_TOKEN_TTL_SECONDS;
333
+ const authInfo = {
334
+ token,
335
+ clientId: 'rivet-mcp',
336
+ scopes: [MCP_OAUTH_SCOPE],
337
+ expiresAt: Math.floor(Date.now() / 1000) + Math.max(secondsUntilExpiry, 1),
338
+ extra: {
339
+ ...(issuedToken?.refreshToken
340
+ ? { refreshToken: issuedToken.refreshToken }
341
+ : {}),
342
+ ...(user ? { email: user.email, userId: user.id } : {}),
343
+ },
344
+ };
345
+ this.pruneVerifiedTokens();
346
+ this.verifiedTokens.set(token, {
347
+ authInfo,
348
+ cachedUntil: Date.now() +
349
+ Math.min(TOKEN_VERIFY_CACHE_TTL_MS, Math.max(secondsUntilExpiry, 1) * 1000),
350
+ });
351
+ return authInfo;
352
+ }
353
+ /**
354
+ * Invalidates a bearer token issued by this OAuth provider and its paired
355
+ * refresh token, if the provider knows one.
356
+ */
357
+ revokeAccessToken(token) {
358
+ const issuedToken = this.issuedBearerTokens.get(token);
359
+ this.revokedAccessTokens.add(token);
360
+ if (issuedToken?.refreshToken) {
361
+ this.revokedRefreshTokens.add(issuedToken.refreshToken);
362
+ this.activeRefreshTokens.delete(issuedToken.refreshToken);
363
+ }
364
+ this.issuedBearerTokens.delete(token);
365
+ this.verifiedTokens.delete(token);
366
+ }
367
+ rememberIssuedBearerToken(tokens) {
368
+ this.pruneIssuedBearerTokens();
369
+ this.issuedBearerTokens.set(tokens.token, {
370
+ refreshToken: tokens.refreshToken,
371
+ user: tokens.user,
372
+ expiresAt: getTokenExpiryMs(tokens.token),
373
+ });
374
+ if (tokens.refreshToken) {
375
+ this.activeRefreshTokens.add(tokens.refreshToken);
376
+ }
377
+ }
378
+ getValidCodeEntry(client, authorizationCode) {
379
+ const entry = this.authorizationCodes.get(authorizationCode);
380
+ if (!entry ||
381
+ entry.clientId !== client.client_id ||
382
+ entry.expiresAt < Date.now()) {
383
+ this.authorizationCodes.delete(authorizationCode);
384
+ throw new errors_js_1.InvalidGrantError('Invalid or expired authorization code');
385
+ }
386
+ return entry;
387
+ }
388
+ toOAuthTokens(accessToken, refreshToken) {
389
+ const secondsUntilExpiry = (0, accessTokenRefresh_1.getJwtSecondsUntilExpiry)(accessToken) ?? DEFAULT_TOKEN_TTL_SECONDS;
390
+ return {
391
+ access_token: accessToken,
392
+ token_type: 'bearer',
393
+ expires_in: Math.max(secondsUntilExpiry, 1),
394
+ scope: MCP_OAUTH_SCOPE,
395
+ ...(refreshToken ? { refresh_token: refreshToken } : {}),
396
+ };
397
+ }
398
+ async pollForRivetTokens(sessionId, pollSecret) {
399
+ for (let attempt = 0; attempt < TOKEN_POLL_MAX_ATTEMPTS; attempt++) {
400
+ const response = await this.fetchFn(`${this.proxyUrl}/api/auth/google/token`, {
401
+ method: 'POST',
402
+ headers: { 'Content-Type': 'application/json' },
403
+ body: JSON.stringify({ session: sessionId, pollSecret }),
404
+ });
405
+ const result = (await response.json().catch(() => null));
406
+ if (result?.success && result.token) {
407
+ return {
408
+ token: result.token,
409
+ refreshToken: result.refreshToken,
410
+ user: result.user,
411
+ };
412
+ }
413
+ if (result?.error && result.error !== 'Pending') {
414
+ throw new Error(result.error);
415
+ }
416
+ await sleep(this.pollIntervalMs);
417
+ }
418
+ throw new Error('Timed out waiting for Rivet sign-in to complete');
419
+ }
420
+ prunePendingAuthorizations() {
421
+ const now = Date.now();
422
+ for (const [key, value] of this.pendingAuthorizations) {
423
+ if (value.expiresAt < now) {
424
+ this.pendingAuthorizations.delete(key);
425
+ }
426
+ }
427
+ }
428
+ pruneAuthorizationCodes() {
429
+ const now = Date.now();
430
+ for (const [key, value] of this.authorizationCodes) {
431
+ if (value.expiresAt < now) {
432
+ this.authorizationCodes.delete(key);
433
+ }
434
+ }
435
+ }
436
+ pruneVerifiedTokens() {
437
+ const now = Date.now();
438
+ for (const [key, value] of this.verifiedTokens) {
439
+ if (value.cachedUntil < now) {
440
+ this.verifiedTokens.delete(key);
441
+ }
442
+ }
443
+ }
444
+ pruneIssuedBearerTokens() {
445
+ const now = Date.now();
446
+ for (const [key, value] of this.issuedBearerTokens) {
447
+ if (value.expiresAt < now) {
448
+ this.issuedBearerTokens.delete(key);
449
+ }
450
+ }
451
+ }
452
+ }
453
+ exports.RivetOAuthServerProvider = RivetOAuthServerProvider;
454
+ //# sourceMappingURL=httpOAuthProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpOAuthProvider.js","sourceRoot":"","sources":["../../../src/mcp/auth/httpOAuthProvider.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,8 @@ export interface AuthToolDeps {
6
6
  telemetry?: TelemetryService;
7
7
  /** The MCP client (`--editor`), recorded with the login for analytics. */
8
8
  mcpEditor?: string;
9
+ /** Rejects an active HTTP OAuth bearer after logout clears local credentials. */
10
+ revokeBearerToken?: (token: string) => void;
9
11
  }
10
12
  type ToolResponse = {
11
13
  content: Array<{
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/auth/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAMxE,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,KAAK,YAAY,GAAG;IAClB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAiCF;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAC1B,aAAa,WAAW,KACvB,CAAC,MAAM,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAWrC,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,GACxB,KAAK,SAAS,EACd,OAAO,MAAM,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,KACxC,SAwBF,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAyH1E"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/auth/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAMxE,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iFAAiF;IACjF,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAED,KAAK,YAAY,GAAG;IAClB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAiCF;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAC1B,aAAa,WAAW,KACvB,CAAC,MAAM,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAWrC,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,GACxB,KAAK,SAAS,EACd,OAAO,MAAM,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,KACxC,SAwBF,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAuI1E"}
@@ -33,7 +33,7 @@ const createAuthGuard = (authService) => {
33
33
  if (ok) {
34
34
  return null;
35
35
  }
36
- return errorResponse('Authentication required. Ask the user to run the `login` tool (it opens a browser to sign in with Google), then retry.', 'AUTH_REQUIRED');
36
+ return errorResponse('Authentication required. Call the `mcp_auth` tool (it opens a browser to sign in with Google), then retry.', 'AUTH_REQUIRED');
37
37
  };
38
38
  };
39
39
  exports.createAuthGuard = createAuthGuard;
@@ -73,8 +73,8 @@ const withAuthGuard = (mcp, guard) => {
73
73
  };
74
74
  exports.withAuthGuard = withAuthGuard;
75
75
  function registerAuthTools(mcp, deps) {
76
- const { authService, telemetry, mcpEditor } = deps;
77
- registerTool(mcp, 'login', 'Authenticate this machine with Rivet via Google. Opens the user\'s browser to sign in, then blocks (~up to 2 minutes) until they finish. If already signed in with a valid session, returns immediately. On timeout, returns success:false with a retryable message — call login again to keep waiting.', {}, async () => {
76
+ const { authService, telemetry, mcpEditor, revokeBearerToken } = deps;
77
+ const loginHandler = async () => {
78
78
  try {
79
79
  // Real validation — only short-circuit on a genuinely live session,
80
80
  // never on a merely-present (possibly stale) token.
@@ -121,11 +121,18 @@ function registerAuthTools(mcp, deps) {
121
121
  log.warn('login tool error:', err);
122
122
  return errorResponse(err instanceof Error ? err.message : 'Login failed', 'LOGIN_FAILED');
123
123
  }
124
- });
124
+ };
125
+ registerTool(mcp, 'login', 'Authenticate this machine with Rivet via Google. Opens the user\'s browser to sign in, then blocks (~up to 2 minutes) until they finish. If already signed in with a valid session, returns immediately. On timeout, returns success:false with a retryable message — call login again to keep waiting.', {}, loginHandler);
126
+ registerTool(mcp, 'mcp_auth', 'Authenticate this MCP server so the user can access all of its tools. When Rivet reports AUTH_REQUIRED, call this tool soon through your MCP tool-calling interface.', {}, loginHandler);
125
127
  registerTool(mcp, 'logout', 'Sign this machine out of Rivet and clear the stored credentials.', {}, async () => {
126
128
  try {
127
- const email = (0, ConfigManager_1.getConfigManager)().getEmail();
129
+ const configManager = (0, ConfigManager_1.getConfigManager)();
130
+ const email = configManager.getEmail();
131
+ const bearerToken = configManager.getAuthToken();
128
132
  await authService.logout();
133
+ if (bearerToken) {
134
+ revokeBearerToken?.(bearerToken);
135
+ }
129
136
  telemetry?.track('mcp_logout', { source: 'mcp' });
130
137
  return jsonResponse({ loggedOut: true, email });
131
138
  }