rivet-design 0.10.8 → 0.11.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 (156) hide show
  1. package/dist/index.d.ts +47 -3
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +277 -123
  4. package/dist/index.js.map +1 -1
  5. package/dist/mcp/agent-variants/SessionStore.d.ts +28 -4
  6. package/dist/mcp/agent-variants/SessionStore.d.ts.map +1 -1
  7. package/dist/mcp/agent-variants/SessionStore.js +356 -123
  8. package/dist/mcp/agent-variants/SessionStore.js.map +1 -1
  9. package/dist/mcp/agent-variants/WorktreeOrchestrator.d.ts +84 -4
  10. package/dist/mcp/agent-variants/WorktreeOrchestrator.d.ts.map +1 -1
  11. package/dist/mcp/agent-variants/WorktreeOrchestrator.js +744 -145
  12. package/dist/mcp/agent-variants/WorktreeOrchestrator.js.map +1 -1
  13. package/dist/mcp/agent-variants/WorktreeOrchestrator.testHelpers.d.ts +8 -3
  14. package/dist/mcp/agent-variants/WorktreeOrchestrator.testHelpers.d.ts.map +1 -1
  15. package/dist/mcp/agent-variants/WorktreeOrchestrator.testHelpers.js +8 -3
  16. package/dist/mcp/agent-variants/WorktreeOrchestrator.testHelpers.js.map +1 -1
  17. package/dist/mcp/agent-variants/contracts.d.ts +7984 -1625
  18. package/dist/mcp/agent-variants/contracts.d.ts.map +1 -1
  19. package/dist/mcp/agent-variants/contracts.js +312 -154
  20. package/dist/mcp/agent-variants/contracts.js.map +1 -1
  21. package/dist/mcp/agent-variants/createZeroToOneTool.d.ts +2 -3
  22. package/dist/mcp/agent-variants/createZeroToOneTool.d.ts.map +1 -1
  23. package/dist/mcp/agent-variants/createZeroToOneTool.js +49 -39
  24. package/dist/mcp/agent-variants/createZeroToOneTool.js.map +1 -1
  25. package/dist/mcp/agent-variants/designCritique.d.ts +167 -0
  26. package/dist/mcp/agent-variants/designCritique.d.ts.map +1 -0
  27. package/dist/mcp/agent-variants/designCritique.js +717 -0
  28. package/dist/mcp/agent-variants/designCritique.js.map +1 -0
  29. package/dist/mcp/agent-variants/diffQa.d.ts +7 -0
  30. package/dist/mcp/agent-variants/diffQa.d.ts.map +1 -0
  31. package/dist/mcp/agent-variants/diffQa.js +67 -0
  32. package/dist/mcp/agent-variants/diffQa.js.map +1 -0
  33. package/dist/mcp/agent-variants/index.d.ts +3 -3
  34. package/dist/mcp/agent-variants/index.d.ts.map +1 -1
  35. package/dist/mcp/agent-variants/index.js +2 -1
  36. package/dist/mcp/agent-variants/index.js.map +1 -1
  37. package/dist/mcp/agent-variants/pinterestSourceContext.d.ts +4 -2
  38. package/dist/mcp/agent-variants/pinterestSourceContext.d.ts.map +1 -1
  39. package/dist/mcp/agent-variants/pinterestSourceContext.js +7 -6
  40. package/dist/mcp/agent-variants/pinterestSourceContext.js.map +1 -1
  41. package/dist/mcp/agent-variants/previewQa.d.ts +6 -4
  42. package/dist/mcp/agent-variants/previewQa.d.ts.map +1 -1
  43. package/dist/mcp/agent-variants/previewQa.js +140 -13
  44. package/dist/mcp/agent-variants/previewQa.js.map +1 -1
  45. package/dist/mcp/agent-variants/sourceContext.d.ts +20 -5
  46. package/dist/mcp/agent-variants/sourceContext.d.ts.map +1 -1
  47. package/dist/mcp/agent-variants/sourceContext.js +99 -115
  48. package/dist/mcp/agent-variants/sourceContext.js.map +1 -1
  49. package/dist/mcp/agent-variants/tools.d.ts +7 -0
  50. package/dist/mcp/agent-variants/tools.d.ts.map +1 -1
  51. package/dist/mcp/agent-variants/tools.js +216 -15
  52. package/dist/mcp/agent-variants/tools.js.map +1 -1
  53. package/dist/mcp/agent-variants/variantContext.d.ts +19 -0
  54. package/dist/mcp/agent-variants/variantContext.d.ts.map +1 -0
  55. package/dist/mcp/agent-variants/variantContext.js +355 -0
  56. package/dist/mcp/agent-variants/variantContext.js.map +1 -0
  57. package/dist/mcp/auth/httpOAuthProvider.d.ts +103 -0
  58. package/dist/mcp/auth/httpOAuthProvider.d.ts.map +1 -0
  59. package/dist/mcp/auth/httpOAuthProvider.js +454 -0
  60. package/dist/mcp/auth/httpOAuthProvider.js.map +1 -0
  61. package/dist/mcp/auth/tools.d.ts +2 -0
  62. package/dist/mcp/auth/tools.d.ts.map +1 -1
  63. package/dist/mcp/auth/tools.js +12 -5
  64. package/dist/mcp/auth/tools.js.map +1 -1
  65. package/dist/mcp/httpServer.d.ts +36 -0
  66. package/dist/mcp/httpServer.d.ts.map +1 -0
  67. package/dist/mcp/httpServer.js +307 -0
  68. package/dist/mcp/httpServer.js.map +1 -0
  69. package/dist/mcp/server.d.ts +17 -0
  70. package/dist/mcp/server.d.ts.map +1 -1
  71. package/dist/mcp/server.js +41 -19
  72. package/dist/mcp/server.js.map +1 -1
  73. package/dist/proxy-middleware/proxy-config.d.ts.map +1 -1
  74. package/dist/proxy-middleware/proxy-config.js +5 -2
  75. package/dist/proxy-middleware/proxy-config.js.map +1 -1
  76. package/dist/routes/agentVariants.d.ts.map +1 -1
  77. package/dist/routes/agentVariants.js +6 -4
  78. package/dist/routes/agentVariants.js.map +1 -1
  79. package/dist/routes/mcp.d.ts.map +1 -1
  80. package/dist/routes/mcp.js +2 -1
  81. package/dist/routes/mcp.js.map +1 -1
  82. package/dist/server.d.ts +9 -0
  83. package/dist/server.d.ts.map +1 -1
  84. package/dist/server.js +13 -5
  85. package/dist/server.js.map +1 -1
  86. package/dist/services/AuthService.d.ts +1 -0
  87. package/dist/services/AuthService.d.ts.map +1 -1
  88. package/dist/services/AuthService.js +11 -1
  89. package/dist/services/AuthService.js.map +1 -1
  90. package/dist/services/BrowserAgentClient.d.ts +54 -0
  91. package/dist/services/BrowserAgentClient.d.ts.map +1 -0
  92. package/dist/services/BrowserAgentClient.js +126 -0
  93. package/dist/services/BrowserAgentClient.js.map +1 -0
  94. package/dist/services/ConfigManager.d.ts +5 -0
  95. package/dist/services/ConfigManager.d.ts.map +1 -1
  96. package/dist/services/ConfigManager.js +25 -3
  97. package/dist/services/ConfigManager.js.map +1 -1
  98. package/dist/services/DevServerRuntimeService.d.ts +119 -0
  99. package/dist/services/DevServerRuntimeService.d.ts.map +1 -0
  100. package/dist/services/DevServerRuntimeService.js +657 -0
  101. package/dist/services/DevServerRuntimeService.js.map +1 -0
  102. package/dist/services/GatewayClient.d.ts +25 -0
  103. package/dist/services/GatewayClient.d.ts.map +1 -1
  104. package/dist/services/GatewayClient.js +70 -11
  105. package/dist/services/GatewayClient.js.map +1 -1
  106. package/dist/services/InlineVariantGenerationService.d.ts +2 -0
  107. package/dist/services/InlineVariantGenerationService.d.ts.map +1 -1
  108. package/dist/services/InlineVariantGenerationService.js +70 -3
  109. package/dist/services/InlineVariantGenerationService.js.map +1 -1
  110. package/dist/services/RequestAuthContext.d.ts +7 -1
  111. package/dist/services/RequestAuthContext.d.ts.map +1 -1
  112. package/dist/services/RequestAuthContext.js +15 -2
  113. package/dist/services/RequestAuthContext.js.map +1 -1
  114. package/dist/services/SessionBridgeService.d.ts +1 -0
  115. package/dist/services/SessionBridgeService.d.ts.map +1 -1
  116. package/dist/services/SessionBridgeService.js +16 -1
  117. package/dist/services/SessionBridgeService.js.map +1 -1
  118. package/dist/services/VariantRunService.d.ts +1 -0
  119. package/dist/services/VariantRunService.d.ts.map +1 -1
  120. package/dist/services/VariantRunService.js +1 -0
  121. package/dist/services/VariantRunService.js.map +1 -1
  122. package/dist/services/VariantsRuntime.d.ts.map +1 -1
  123. package/dist/services/VariantsRuntime.js +1 -0
  124. package/dist/services/VariantsRuntime.js.map +1 -1
  125. package/dist/services/WorktreeManager.d.ts +1 -8
  126. package/dist/services/WorktreeManager.d.ts.map +1 -1
  127. package/dist/services/WorktreeManager.js +1 -28
  128. package/dist/services/WorktreeManager.js.map +1 -1
  129. package/dist/services/createAgentVariantsOrchestrator.d.ts.map +1 -1
  130. package/dist/services/createAgentVariantsOrchestrator.js +7 -0
  131. package/dist/services/createAgentVariantsOrchestrator.js.map +1 -1
  132. package/dist/utils/skills/describe-motion-protocol.d.ts +2 -3
  133. package/dist/utils/skills/describe-motion-protocol.d.ts.map +1 -1
  134. package/dist/utils/skills/describe-motion-protocol.js +50 -35
  135. package/dist/utils/skills/describe-motion-protocol.js.map +1 -1
  136. package/dist/utils/skills/shared-variants-protocol.d.ts +1 -1
  137. package/dist/utils/skills/shared-variants-protocol.d.ts.map +1 -1
  138. package/dist/utils/skills/shared-variants-protocol.js +21 -15
  139. package/dist/utils/skills/shared-variants-protocol.js.map +1 -1
  140. package/dist/utils/variantSessionStart.d.ts +3 -0
  141. package/dist/utils/variantSessionStart.d.ts.map +1 -0
  142. package/dist/utils/variantSessionStart.js +7 -0
  143. package/dist/utils/variantSessionStart.js.map +1 -0
  144. package/package.json +2 -1
  145. package/src/ui/dist/assets/{main-WqlDU4Ou.js → main-Cw6Pd8ye.js} +204 -204
  146. package/src/ui/dist/assets/main-DkCj7b2K.css +1 -0
  147. package/src/ui/dist/index.html +2 -2
  148. package/dist/mcp/agent-variants/designContextStore.d.ts +0 -160
  149. package/dist/mcp/agent-variants/designContextStore.d.ts.map +0 -1
  150. package/dist/mcp/agent-variants/designContextStore.js +0 -295
  151. package/dist/mcp/agent-variants/designContextStore.js.map +0 -1
  152. package/dist/mcp/agent-variants/inspirationDesignContext.d.ts +0 -440
  153. package/dist/mcp/agent-variants/inspirationDesignContext.d.ts.map +0 -1
  154. package/dist/mcp/agent-variants/inspirationDesignContext.js +0 -2467
  155. package/dist/mcp/agent-variants/inspirationDesignContext.js.map +0 -1
  156. package/src/ui/dist/assets/main-auZA25j4.css +0 -1
@@ -0,0 +1,307 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.startMCPServerHttp = exports.createMcpHttpApp = exports.OAUTH_CALLBACK_COMPLETE_PATH = exports.MCP_HTTP_PATH = exports.DEFAULT_MCP_HTTP_PORT = void 0;
7
+ const crypto_1 = require("crypto");
8
+ const express_1 = __importDefault(require("express"));
9
+ const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
10
+ const router_js_1 = require("@modelcontextprotocol/sdk/server/auth/router.js");
11
+ const bearerAuth_js_1 = require("@modelcontextprotocol/sdk/server/auth/middleware/bearerAuth.js");
12
+ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
13
+ const httpOAuthProvider_1 = require("./auth/httpOAuthProvider");
14
+ const server_1 = require("./server");
15
+ const ConfigManager_1 = require("../services/ConfigManager");
16
+ const RequestAuthContext_1 = require("../services/RequestAuthContext");
17
+ const logger_1 = require("../utils/logger");
18
+ const skillWriter_1 = require("../utils/skillWriter");
19
+ const log = (0, logger_1.createLogger)('mcp-http');
20
+ exports.DEFAULT_MCP_HTTP_PORT = 5891;
21
+ exports.MCP_HTTP_PATH = '/mcp';
22
+ exports.OAUTH_CALLBACK_COMPLETE_PATH = '/oauth/callback/complete';
23
+ const MCP_OAUTH_SCOPE = 'rivet';
24
+ const MCP_HTTP_HOST = '127.0.0.1';
25
+ /**
26
+ * Browser page served at `/` as the OAuth callback. The proxy only accepts
27
+ * bare localhost origins as `redirectOrigin` (no custom paths), so it
28
+ * redirects the browser to `/?session=` with the Supabase tokens in the URL
29
+ * hash; this page forwards them to the local server, which finishes the
30
+ * login and replies with the MCP client's redirect URL (carrying the
31
+ * authorization code) to navigate to.
32
+ */
33
+ const getOAuthCallbackHtml = (completePath) => `<!doctype html>
34
+ <html>
35
+ <head>
36
+ <meta charset="utf-8" />
37
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
38
+ <title>Rivet authentication</title>
39
+ <style>
40
+ body {
41
+ margin: 0;
42
+ min-height: 100vh;
43
+ display: grid;
44
+ place-items: center;
45
+ font-family: system-ui, sans-serif;
46
+ background: #0b0b0f;
47
+ color: #fff;
48
+ }
49
+ main {
50
+ max-width: 420px;
51
+ padding: 32px;
52
+ text-align: center;
53
+ }
54
+ </style>
55
+ </head>
56
+ <body>
57
+ <main>
58
+ <h1>Finishing Rivet sign in...</h1>
59
+ <p>You will be sent back to your editor automatically.</p>
60
+ </main>
61
+ <script>
62
+ const params = new URLSearchParams(window.location.search);
63
+ const hash = new URLSearchParams(window.location.hash.slice(1));
64
+ if (!params.get('session') || !hash.get('access_token')) {
65
+ document.querySelector('h1').textContent = 'Rivet MCP server is running';
66
+ document.querySelector('p').textContent =
67
+ 'Connect from your MCP client (e.g. Cursor) to sign in.';
68
+ throw new Error('Not an OAuth callback');
69
+ }
70
+ if (window.location.hash) {
71
+ window.history.replaceState(
72
+ null,
73
+ document.title,
74
+ window.location.pathname + window.location.search
75
+ );
76
+ }
77
+ fetch('${completePath}', {
78
+ method: 'POST',
79
+ headers: { 'Content-Type': 'application/json' },
80
+ body: JSON.stringify({
81
+ sessionId: params.get('session'),
82
+ accessToken: hash.get('access_token'),
83
+ refreshToken: hash.get('refresh_token')
84
+ })
85
+ }).then(async (response) => {
86
+ const result = await response.json().catch(() => null);
87
+ if (response.ok && result && result.redirectUrl) {
88
+ document.querySelector('h1').textContent = 'Rivet sign in complete';
89
+ window.location.replace(result.redirectUrl);
90
+ } else {
91
+ document.querySelector('h1').textContent = 'Rivet sign in failed';
92
+ }
93
+ }).catch(() => {
94
+ document.querySelector('h1').textContent = 'Rivet sign in failed';
95
+ });
96
+ </script>
97
+ </body>
98
+ </html>`;
99
+ const getAuthExtraString = (req, key) => {
100
+ const value = req.auth?.extra?.[key];
101
+ return typeof value === 'string' ? value : undefined;
102
+ };
103
+ /** Builds the request-scoped credentials used by services during MCP tools. */
104
+ const getRequestAuthContextValue = (req) => ({
105
+ token: req.auth?.token,
106
+ refreshToken: getAuthExtraString(req, 'refreshToken'),
107
+ email: getAuthExtraString(req, 'email'),
108
+ userId: getAuthExtraString(req, 'userId'),
109
+ });
110
+ /** Handles an MCP request with bearer credentials isolated to this request. */
111
+ const handleMcpRequestWithAuthContext = (req, callback) => {
112
+ return (0, RequestAuthContext_1.runWithRequestAuthContext)(getRequestAuthContextValue(req), callback);
113
+ };
114
+ /**
115
+ * Creates the Express app exposing the Rivet MCP server over streamable HTTP
116
+ * with native MCP OAuth support:
117
+ * - `/.well-known/oauth-protected-resource/mcp` + `/.well-known/oauth-authorization-server`
118
+ * - `/authorize`, `/token`, `/register` (dynamic client registration)
119
+ * - `/oauth/callback` browser landing page for the proxy Google flow
120
+ * - `/mcp` streamable HTTP endpoint guarded by bearer auth (401 +
121
+ * WWW-Authenticate with resource metadata when unauthenticated)
122
+ */
123
+ const createMcpHttpApp = (options) => {
124
+ const { baseUrl, provider, createMcp } = options;
125
+ const mcpUrl = new URL(exports.MCP_HTTP_PATH, baseUrl);
126
+ const app = (0, express_1.default)();
127
+ app.use(express_1.default.json());
128
+ app.use((0, router_js_1.mcpAuthRouter)({
129
+ provider,
130
+ issuerUrl: baseUrl,
131
+ resourceServerUrl: mcpUrl,
132
+ resourceName: 'Rivet',
133
+ scopesSupported: [MCP_OAUTH_SCOPE],
134
+ }));
135
+ app.get('/', (_req, res) => {
136
+ res
137
+ .status(200)
138
+ .type('html')
139
+ .send(getOAuthCallbackHtml(exports.OAUTH_CALLBACK_COMPLETE_PATH));
140
+ });
141
+ app.post(exports.OAUTH_CALLBACK_COMPLETE_PATH, async (req, res) => {
142
+ try {
143
+ const { redirectUrl } = await provider.completeBrowserCallback(req.body ?? {});
144
+ res.json({ success: true, redirectUrl });
145
+ }
146
+ catch (error) {
147
+ log.warn('OAuth callback completion failed:', error);
148
+ res.status(400).json({
149
+ success: false,
150
+ error: error instanceof Error ? error.message : 'Authentication failed',
151
+ });
152
+ }
153
+ });
154
+ const bearerAuth = (0, bearerAuth_js_1.requireBearerAuth)({
155
+ verifier: provider,
156
+ resourceMetadataUrl: (0, router_js_1.getOAuthProtectedResourceMetadataUrl)(mcpUrl),
157
+ });
158
+ // The Rivet MCP server holds long-lived session state (visual editor
159
+ // bridge, telemetry), so a single instance is shared across MCP sessions:
160
+ // a new initialize request closes the previous session's transport and
161
+ // reconnects the server to the new one.
162
+ let mcpHandle = null;
163
+ const transports = new Map();
164
+ let initializeRequestChain = Promise.resolve();
165
+ let activeSessionPostRequestCount = 0;
166
+ const activeSessionPostRequestIdleResolvers = new Set();
167
+ /** Waits until active MCP tool/resource POST requests have finished. */
168
+ const waitForActiveSessionPostRequests = () => {
169
+ if (activeSessionPostRequestCount === 0) {
170
+ return Promise.resolve();
171
+ }
172
+ return new Promise((resolve) => {
173
+ activeSessionPostRequestIdleResolvers.add(resolve);
174
+ });
175
+ };
176
+ /** Tracks active session POSTs so reconnects do not close in-flight work. */
177
+ const handleActiveSessionPostRequest = async (req, callback) => {
178
+ if (req.method !== 'POST') {
179
+ await callback();
180
+ return;
181
+ }
182
+ activeSessionPostRequestCount += 1;
183
+ try {
184
+ await callback();
185
+ }
186
+ finally {
187
+ activeSessionPostRequestCount -= 1;
188
+ if (activeSessionPostRequestCount === 0) {
189
+ for (const resolve of activeSessionPostRequestIdleResolvers) {
190
+ resolve();
191
+ }
192
+ activeSessionPostRequestIdleResolvers.clear();
193
+ }
194
+ }
195
+ };
196
+ app.all(exports.MCP_HTTP_PATH, bearerAuth, async (req, res) => {
197
+ try {
198
+ const sessionId = req.headers['mcp-session-id'];
199
+ const existingTransport = sessionId
200
+ ? transports.get(sessionId)
201
+ : undefined;
202
+ if (existingTransport) {
203
+ await handleActiveSessionPostRequest(req, () => handleMcpRequestWithAuthContext(req, () => existingTransport.handleRequest(req, res, req.body)));
204
+ return;
205
+ }
206
+ if (req.method === 'POST' && (0, types_js_1.isInitializeRequest)(req.body)) {
207
+ const handleInitializeRequest = async () => {
208
+ await waitForActiveSessionPostRequests();
209
+ for (const transport of transports.values()) {
210
+ await transport.close();
211
+ }
212
+ transports.clear();
213
+ if (!mcpHandle) {
214
+ mcpHandle = createMcp();
215
+ }
216
+ else {
217
+ await mcpHandle.closeActiveSession();
218
+ }
219
+ const transport = new streamableHttp_js_1.StreamableHTTPServerTransport({
220
+ sessionIdGenerator: () => (0, crypto_1.randomUUID)(),
221
+ onsessioninitialized: (newSessionId) => {
222
+ transports.set(newSessionId, transport);
223
+ },
224
+ });
225
+ await mcpHandle.mcp.connect(transport);
226
+ // Protocol.connect installs its own onclose; chain ours after it so
227
+ // closed sessions drop out of the transport map.
228
+ const protocolOnClose = transport.onclose;
229
+ transport.onclose = () => {
230
+ const closedSessionId = transport.sessionId;
231
+ if (closedSessionId) {
232
+ transports.delete(closedSessionId);
233
+ }
234
+ protocolOnClose?.();
235
+ };
236
+ await handleMcpRequestWithAuthContext(req, () => transport.handleRequest(req, res, req.body));
237
+ };
238
+ const initializeRequest = initializeRequestChain.then(handleInitializeRequest, handleInitializeRequest);
239
+ initializeRequestChain = initializeRequest.catch(() => undefined);
240
+ await initializeRequest;
241
+ return;
242
+ }
243
+ res.status(400).json({
244
+ jsonrpc: '2.0',
245
+ error: {
246
+ code: -32000,
247
+ message: 'Bad Request: No valid session ID provided',
248
+ },
249
+ id: null,
250
+ });
251
+ }
252
+ catch (error) {
253
+ log.warn('MCP HTTP request failed:', error);
254
+ if (!res.headersSent) {
255
+ res.status(500).json({
256
+ jsonrpc: '2.0',
257
+ error: { code: -32603, message: 'Internal server error' },
258
+ id: null,
259
+ });
260
+ }
261
+ }
262
+ });
263
+ return app;
264
+ };
265
+ exports.createMcpHttpApp = createMcpHttpApp;
266
+ /**
267
+ * Starts the Rivet MCP server over streamable HTTP on localhost so MCP
268
+ * clients that implement the MCP OAuth authorization spec (Cursor, Claude,
269
+ * Codex) can offer their native "Connect" sign-in flow. Completed logins
270
+ * persist credentials via ConfigManager, the same store the stdio mode uses.
271
+ */
272
+ const startMCPServerHttp = async (options = {}) => {
273
+ (0, logger_1.setLogLevel)(process.env.RIVET_LOG_LEVEL ?? 'INFO');
274
+ const port = options.port ?? exports.DEFAULT_MCP_HTTP_PORT;
275
+ const baseUrl = new URL(`http://${MCP_HTTP_HOST}:${port}`);
276
+ const configManager = (0, ConfigManager_1.getConfigManager)();
277
+ if (options.mcpEditor === 'claude' || options.mcpEditor === undefined) {
278
+ (0, skillWriter_1.writeSkillFileIfNeeded)();
279
+ }
280
+ const provider = new httpOAuthProvider_1.RivetOAuthServerProvider({
281
+ proxyUrl: configManager.getProxyUrl(),
282
+ // The proxy only accepts bare localhost origins; the callback page is
283
+ // served at `/`.
284
+ callbackUrl: baseUrl.origin,
285
+ mcpEditor: options.mcpEditor,
286
+ persistTokens: ({ token, refreshToken, user }) => {
287
+ configManager.setAuth(token, user?.email ?? configManager.getEmail() ?? '', refreshToken, user?.id);
288
+ },
289
+ isRefreshTokenCurrent: (refreshToken) => configManager.getRefreshToken() === refreshToken,
290
+ });
291
+ const app = (0, exports.createMcpHttpApp)({
292
+ baseUrl,
293
+ provider,
294
+ createMcp: () => (0, server_1.createRivetMcp)({
295
+ mcpEditor: options.mcpEditor,
296
+ revokeBearerToken: (token) => provider.revokeAccessToken(token),
297
+ }),
298
+ });
299
+ const server = await new Promise((resolve, reject) => {
300
+ const listening = app.listen(port, MCP_HTTP_HOST, () => resolve(listening));
301
+ listening.on('error', reject);
302
+ });
303
+ log.info(`Rivet MCP server (streamable HTTP) listening at ${baseUrl.href.replace(/\/$/, '')}${exports.MCP_HTTP_PATH}`);
304
+ return server;
305
+ };
306
+ exports.startMCPServerHttp = startMCPServerHttp;
307
+ //# sourceMappingURL=httpServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpServer.js","sourceRoot":"","sources":["../../src/mcp/httpServer.ts"],"names":[],"mappings":";;;;;;AAAA,mCAAoC;AAEpC,sDAA+D;AAC/D,0FAAmG;AACnG,+EAGyD;AACzD,kGAAmG;AACnG,iEAAyE;AACzE,gEAAoE;AACpE,qCAA+D;AAC/D,6DAA6D;AAC7D,uEAGwC;AACxC,4CAA4D;AAC5D,sDAA8D;AAE9D,MAAM,GAAG,GAAG,IAAA,qBAAY,EAAC,UAAU,CAAC,CAAC;AAExB,QAAA,qBAAqB,GAAG,IAAI,CAAC;AAC7B,QAAA,aAAa,GAAG,MAAM,CAAC;AACvB,QAAA,4BAA4B,GAAG,0BAA0B,CAAC;AACvE,MAAM,eAAe,GAAG,OAAO,CAAC;AAChC,MAAM,aAAa,GAAG,WAAW,CAAC;AAElC;;;;;;;GAOG;AACH,MAAM,oBAAoB,GAAG,CAAC,YAAoB,EAAU,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eA4ChD,YAAY;;;;;;;;;;;;;;;;;;;;;QAqBnB,CAAC;AAUT,MAAM,kBAAkB,GAAG,CAAC,GAAY,EAAE,GAAW,EAAsB,EAAE;IAC3E,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC,CAAC;AAEF,+EAA+E;AAC/E,MAAM,0BAA0B,GAAG,CAAC,GAAY,EAA2B,EAAE,CAAC,CAAC;IAC7E,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK;IACtB,YAAY,EAAE,kBAAkB,CAAC,GAAG,EAAE,cAAc,CAAC;IACrD,KAAK,EAAE,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC;IACvC,MAAM,EAAE,kBAAkB,CAAC,GAAG,EAAE,QAAQ,CAAC;CAC1C,CAAC,CAAC;AAEH,+EAA+E;AAC/E,MAAM,+BAA+B,GAAG,CACtC,GAAY,EACZ,QAA6B,EACd,EAAE;IACjB,OAAO,IAAA,8CAAyB,EAAC,0BAA0B,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC9E,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACI,MAAM,gBAAgB,GAAG,CAAC,OAA0B,EAAmB,EAAE;IAC9E,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IACjD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,qBAAa,EAAE,OAAO,CAAC,CAAC;IAE/C,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;IACtB,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAExB,GAAG,CAAC,GAAG,CACL,IAAA,yBAAa,EAAC;QACZ,QAAQ;QACR,SAAS,EAAE,OAAO;QAClB,iBAAiB,EAAE,MAAM;QACzB,YAAY,EAAE,OAAO;QACrB,eAAe,EAAE,CAAC,eAAe,CAAC;KACnC,CAAC,CACH,CAAC;IAEF,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;QAC5C,GAAG;aACA,MAAM,CAAC,GAAG,CAAC;aACX,IAAI,CAAC,MAAM,CAAC;aACZ,IAAI,CAAC,oBAAoB,CAAC,oCAA4B,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CACN,oCAA4B,EAC5B,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QACpC,IAAI,CAAC;YACH,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,QAAQ,CAAC,uBAAuB,CAC5D,GAAG,CAAC,IAAI,IAAI,EAAE,CACf,CAAC;YACF,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,IAAI,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;YACrD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,KAAK,EACH,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB;aACnE,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,UAAU,GAAG,IAAA,iCAAiB,EAAC;QACnC,QAAQ,EAAE,QAAQ;QAClB,mBAAmB,EAAE,IAAA,gDAAoC,EAAC,MAAM,CAAC;KAClE,CAAC,CAAC;IAEH,qEAAqE;IACrE,0EAA0E;IAC1E,uEAAuE;IACvE,wCAAwC;IACxC,IAAI,SAAS,GAA0B,IAAI,CAAC;IAC5C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAyC,CAAC;IACpE,IAAI,sBAAsB,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAC9D,IAAI,6BAA6B,GAAG,CAAC,CAAC;IACtC,MAAM,qCAAqC,GAAG,IAAI,GAAG,EAAc,CAAC;IAEpE,wEAAwE;IACxE,MAAM,gCAAgC,GAAG,GAAkB,EAAE;QAC3D,IAAI,6BAA6B,KAAK,CAAC,EAAE,CAAC;YACxC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,qCAAqC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,6EAA6E;IAC7E,MAAM,8BAA8B,GAAG,KAAK,EAC1C,GAAY,EACZ,QAA6B,EACd,EAAE;QACjB,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,QAAQ,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,6BAA6B,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,QAAQ,EAAE,CAAC;QACnB,CAAC;gBAAS,CAAC;YACT,6BAA6B,IAAI,CAAC,CAAC;YACnC,IAAI,6BAA6B,KAAK,CAAC,EAAE,CAAC;gBACxC,KAAK,MAAM,OAAO,IAAI,qCAAqC,EAAE,CAAC;oBAC5D,OAAO,EAAE,CAAC;gBACZ,CAAC;gBACD,qCAAqC,CAAC,KAAK,EAAE,CAAC;YAChD,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,GAAG,CAAC,GAAG,CAAC,qBAAa,EAAE,UAAU,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;QACvE,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;YACtE,MAAM,iBAAiB,GAAG,SAAS;gBACjC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC;gBAC3B,CAAC,CAAC,SAAS,CAAC;YACd,IAAI,iBAAiB,EAAE,CAAC;gBACtB,MAAM,8BAA8B,CAAC,GAAG,EAAE,GAAG,EAAE,CAC7C,+BAA+B,CAAC,GAAG,EAAE,GAAG,EAAE,CACxC,iBAAiB,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CACpD,CACF,CAAC;gBACF,OAAO;YACT,CAAC;YAED,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,IAAA,8BAAmB,EAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3D,MAAM,uBAAuB,GAAG,KAAK,IAAmB,EAAE;oBACxD,MAAM,gCAAgC,EAAE,CAAC;oBAEzC,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;wBAC5C,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;oBAC1B,CAAC;oBACD,UAAU,CAAC,KAAK,EAAE,CAAC;oBAEnB,IAAI,CAAC,SAAS,EAAE,CAAC;wBACf,SAAS,GAAG,SAAS,EAAE,CAAC;oBAC1B,CAAC;yBAAM,CAAC;wBACN,MAAM,SAAS,CAAC,kBAAkB,EAAE,CAAC;oBACvC,CAAC;oBAED,MAAM,SAAS,GAAG,IAAI,iDAA6B,CAAC;wBAClD,kBAAkB,EAAE,GAAG,EAAE,CAAC,IAAA,mBAAU,GAAE;wBACtC,oBAAoB,EAAE,CAAC,YAAoB,EAAE,EAAE;4BAC7C,UAAU,CAAC,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;wBAC1C,CAAC;qBACF,CAAC,CAAC;oBACH,MAAM,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;oBAEvC,oEAAoE;oBACpE,iDAAiD;oBACjD,MAAM,eAAe,GAAG,SAAS,CAAC,OAAO,CAAC;oBAC1C,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE;wBACvB,MAAM,eAAe,GAAG,SAAS,CAAC,SAAS,CAAC;wBAC5C,IAAI,eAAe,EAAE,CAAC;4BACpB,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;wBACrC,CAAC;wBACD,eAAe,EAAE,EAAE,CAAC;oBACtB,CAAC,CAAC;oBAEF,MAAM,+BAA+B,CAAC,GAAG,EAAE,GAAG,EAAE,CAC9C,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAC5C,CAAC;gBACJ,CAAC,CAAC;gBAEF,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,IAAI,CACnD,uBAAuB,EACvB,uBAAuB,CACxB,CAAC;gBACF,sBAAsB,GAAG,iBAAiB,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAClE,MAAM,iBAAiB,CAAC;gBACxB,OAAO;YACT,CAAC;YAED,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE;oBACL,IAAI,EAAE,CAAC,KAAK;oBACZ,OAAO,EAAE,2CAA2C;iBACrD;gBACD,EAAE,EAAE,IAAI;aACT,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;YAC5C,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBACrB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,uBAAuB,EAAE;oBACzD,EAAE,EAAE,IAAI;iBACT,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAjLW,QAAA,gBAAgB,oBAiL3B;AAOF;;;;;GAKG;AACI,MAAM,kBAAkB,GAAG,KAAK,EACrC,UAAqC,EAAE,EACtB,EAAE;IACnB,IAAA,oBAAW,EAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,MAAM,CAAC,CAAC;IAEnD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,6BAAqB,CAAC;IACnD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,UAAU,aAAa,IAAI,IAAI,EAAE,CAAC,CAAC;IAC3D,MAAM,aAAa,GAAG,IAAA,gCAAgB,GAAE,CAAC;IACzC,IAAI,OAAO,CAAC,SAAS,KAAK,QAAQ,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACtE,IAAA,oCAAsB,GAAE,CAAC;IAC3B,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,4CAAwB,CAAC;QAC5C,QAAQ,EAAE,aAAa,CAAC,WAAW,EAAE;QACrC,sEAAsE;QACtE,iBAAiB;QACjB,WAAW,EAAE,OAAO,CAAC,MAAM;QAC3B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE;YAC/C,aAAa,CAAC,OAAO,CACnB,KAAK,EACL,IAAI,EAAE,KAAK,IAAI,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,EAC7C,YAAY,EACZ,IAAI,EAAE,EAAE,CACT,CAAC;QACJ,CAAC;QACD,qBAAqB,EAAE,CAAC,YAAY,EAAE,EAAE,CACtC,aAAa,CAAC,eAAe,EAAE,KAAK,YAAY;KACnD,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,IAAA,wBAAgB,EAAC;QAC3B,OAAO;QACP,QAAQ;QACR,SAAS,EAAE,GAAG,EAAE,CACd,IAAA,uBAAc,EAAC;YACb,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,iBAAiB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC;SAChE,CAAC;KACL,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3D,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QAC5E,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,mDAAmD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,qBAAa,EAAE,CAAC,CAAC;IAC/G,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AA/CW,QAAA,kBAAkB,sBA+C7B"}
@@ -1,3 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
1
2
  import { type ImageContent } from './changeBatchClassification';
2
3
  import type { ChangeRequest, StaticPreviewChangeTarget } from '../types/change-request-types';
3
4
  /**
@@ -33,6 +34,22 @@ export declare const buildMixedVariantBatchResponse: (rejectedRequest: ChangeReq
33
34
  export declare const buildVariantRequestBatchResponse: (consumedRequest: ChangeRequest | null | undefined) => MCPChangeResponse;
34
35
  export declare const collectStaticPreviewRefineTargetInstructions: (request: ChangeRequest) => StaticPreviewRefineTargetInstruction[];
35
36
  export declare const buildStaticPreviewRefineResponse: (consumedRequest: ChangeRequest | null | undefined) => MCPChangeResponse;
37
+ export type RivetMcpHandle = {
38
+ mcp: McpServer;
39
+ closeActiveSession: () => Promise<void>;
40
+ shutdown: () => Promise<void>;
41
+ };
42
+ export type RivetMcpOptions = {
43
+ mcpEditor?: string;
44
+ revokeBearerToken?: (token: string) => void;
45
+ };
46
+ /**
47
+ * Builds the fully configured Rivet MCP server (tools, auth gating, session
48
+ * bridge, telemetry) without binding it to a transport. Shared by the stdio
49
+ * and streamable-HTTP entry points. Call at most once per process: it
50
+ * registers process-level signal handlers for resource cleanup.
51
+ */
52
+ export declare const createRivetMcp: (options?: RivetMcpOptions) => RivetMcpHandle;
36
53
  export declare const startMCPServer: (mcpEditor?: string) => Promise<void>;
37
54
  export {};
38
55
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AA8CA,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EACV,aAAa,EAEb,yBAAyB,EAC1B,MAAM,+BAA+B,CAAC;AA0FvC;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,GAAI,QAAQ;IAChD,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC,KAAG,CAAC,MAAM,IAAI,CAyBd,CAAC;AA+WF,KAAK,eAAe,GAAG;IACrB,OAAO,EAAE,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,EAAE,IAAI,CAAC;CAChB,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,YAAY,CAAC,CAAC;IAC9D,OAAO,CAAC,EAAE,IAAI,CAAC;CAChB,CAAC;AAEF,KAAK,oCAAoC,GAAG;IAC1C,MAAM,EAAE,yBAAyB,CAAC;IAClC,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAeF,eAAO,MAAM,8BAA8B,GACzC,iBAAiB,aAAa,GAAG,IAAI,GAAG,SAAS,KAChD,eAmBF,CAAC;AAEF,eAAO,MAAM,gCAAgC,GAC3C,iBAAiB,aAAa,GAAG,IAAI,GAAG,SAAS,KAChD,iBAqBF,CAAC;AAWF,eAAO,MAAM,4CAA4C,GACvD,SAAS,aAAa,KACrB,oCAAoC,EAqBtC,CAAC;AAEF,eAAO,MAAM,gCAAgC,GAC3C,iBAAiB,aAAa,GAAG,IAAI,GAAG,SAAS,KAChD,iBA0BF,CAAC;AAEF,eAAO,MAAM,cAAc,GAAU,YAAY,MAAM,KAAG,OAAO,CAAC,IAAI,CA6wCrE,CAAC"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA8CpE,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EACV,aAAa,EAEb,yBAAyB,EAC1B,MAAM,+BAA+B,CAAC;AA0FvC;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,GAAI,QAAQ;IAChD,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC,KAAG,CAAC,MAAM,IAAI,CAyBd,CAAC;AAiXF,KAAK,eAAe,GAAG;IACrB,OAAO,EAAE,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,EAAE,IAAI,CAAC;CAChB,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,YAAY,CAAC,CAAC;IAC9D,OAAO,CAAC,EAAE,IAAI,CAAC;CAChB,CAAC;AAEF,KAAK,oCAAoC,GAAG;IAC1C,MAAM,EAAE,yBAAyB,CAAC;IAClC,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAeF,eAAO,MAAM,8BAA8B,GACzC,iBAAiB,aAAa,GAAG,IAAI,GAAG,SAAS,KAChD,eAmBF,CAAC;AAEF,eAAO,MAAM,gCAAgC,GAC3C,iBAAiB,aAAa,GAAG,IAAI,GAAG,SAAS,KAChD,iBAqBF,CAAC;AAWF,eAAO,MAAM,4CAA4C,GACvD,SAAS,aAAa,KACrB,oCAAoC,EAqBtC,CAAC;AAEF,eAAO,MAAM,gCAAgC,GAC3C,iBAAiB,aAAa,GAAG,IAAI,GAAG,SAAS,KAChD,iBA0BF,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,SAAS,CAAC;IACf,kBAAkB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GACzB,UAAU,eAAe,KACxB,cA2vCF,CAAC;AAEF,eAAO,MAAM,cAAc,GAAU,YAAY,MAAM,KAAG,OAAO,CAAC,IAAI,CAgCrE,CAAC"}
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.startMCPServer = exports.buildStaticPreviewRefineResponse = exports.collectStaticPreviewRefineTargetInstructions = exports.buildVariantRequestBatchResponse = exports.buildMixedVariantBatchResponse = exports.startParentProcessMonitor = void 0;
6
+ exports.startMCPServer = exports.createRivetMcp = exports.buildStaticPreviewRefineResponse = exports.collectStaticPreviewRefineTargetInstructions = exports.buildVariantRequestBatchResponse = exports.buildMixedVariantBatchResponse = exports.startParentProcessMonitor = void 0;
7
7
  const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
8
8
  const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
9
9
  const v3_1 = require("zod/v3");
@@ -368,7 +368,8 @@ const APPLY_GUIDE = 'Read each file in sourceFiles, then apply every change in t
368
368
  '(c) `id` (no whitespace) → `{ type: "element", ref: "#<id>" }`, then ' +
369
369
  '(d) `xpath` → `{ type: "element", ref: "<xpath>" }`, then ' +
370
370
  '(e) single-token `className` → `{ type: "element", ref: ".<token>" }`. ' +
371
- 'Then call `start_variants` with `{ mode: "existing", prompt: instruction, count: variantRequest.count, target }`. Do NOT use the older `propose_variants` chain for this path. `start_variants` returns leased work items; generate each variant in its worktree, call `report_variant_complete` for each leased item, then wait for the user to pick and call `commit_variant`. ' +
371
+ 'If the comment has imageCount > 0, inspect the following image content items before calling `start_variants`; pass each image through `userContext` as `{ transport: "upload", dataUrl, label: "Reference image N", userIntent: "Inline variant visual reference" }` when your client exposes a data URL, or pass concise visual observations as `{ transport: "text", content, label: "Reference image observations", userIntent: "Inline variant visual reference" }` when it does not. ' +
372
+ 'Then call `start_variants` with `{ mode: "existing", prompt: instruction, count: variantRequest.count, target, userContext }`. Do NOT use the older `propose_variants` chain for this path. `start_variants` returns leased work items; generate each variant in its worktree, call `report_variant_complete` for each leased item, then wait for the user to pick and call `commit_variant`. ' +
372
373
  'CRITICAL WORKFLOW: 1. Call get_pending_changes with a message sharing your brief plan. 2. Edit the files. 3. Call get_pending_changes with a message summarizing what you changed and refresh_git: true so the Rivet UI updates. 4. STOP and let the user know their changes have been applied.';
373
374
  /**
374
375
  * Prefix added to the apply guide when a batch targets a specific variant. The
@@ -398,7 +399,8 @@ const VARIANT_REQUEST_GUIDE = 'This batch is a Rivet variant request — do NOT
398
399
  '(c) `{ type: "selector", ref: `#${id}` }` when `id` has no whitespace, then ' +
399
400
  '(d) `{ type: "selector", ref: xpath }`, then ' +
400
401
  '(e) `{ type: "selector", ref: `.${token}` }` for a single-token `className`. ' +
401
- 'Then call `start_variants` with `{ mode: "existing", prompt: instruction, count: variantRequest.count, target }`. Do NOT use the older `propose_variants` chain for this path. `start_variants` returns leased work items; generate each variant in its worktree and call `report_variant_complete` for each leased item. ' +
402
+ 'If the comment has imageCount > 0, inspect the following image content items before calling `start_variants`; pass each image through `userContext` as `{ transport: "upload", dataUrl, label: "Reference image N", userIntent: "Inline variant visual reference" }` when your client exposes a data URL, or pass concise visual observations as `{ transport: "text", content, label: "Reference image observations", userIntent: "Inline variant visual reference" }` when it does not. ' +
403
+ 'Then call `start_variants` with `{ mode: "existing", prompt: instruction, count: variantRequest.count, target, userContext }`. Do NOT use the older `propose_variants` chain for this path. `start_variants` returns leased work items; generate each variant in its worktree and call `report_variant_complete` for each leased item. ' +
402
404
  'After the user picks a variant via `commit_variant`, STOP and tell the user their variant has been committed.';
403
405
  const VARIANT_MIXED_BATCH_GUIDE = 'Mixed batch rejected: a `variantRequest` comment must be the only item in its batch. ' +
404
406
  'Ask the user to send the variant request on its own (clear other pending changes first) and retry.';
@@ -511,21 +513,14 @@ const buildStaticPreviewRefineResponse = (consumedRequest) => {
511
513
  };
512
514
  };
513
515
  exports.buildStaticPreviewRefineResponse = buildStaticPreviewRefineResponse;
514
- const startMCPServer = async (mcpEditor) => {
515
- // Default silent so MCP transport stays clean; opt in via env for debugging
516
- // (e.g. `RIVET_LOG_LEVEL=debug` in the MCP client's env block).
517
- (0, index_core_1.setLogLevel)(process.env.RIVET_LOG_LEVEL ?? 'SILENT');
518
- // Refresh the Claude skill at startup NOT only after a successful
519
- // open_visual_editor (the other call sites below). Otherwise stale guidance
520
- // that refuses an action deadlocks: e.g. a v22 skill that won't open an empty
521
- // folder means open_visual_editor never runs, so the skill never rewrites,
522
- // so the agent keeps refusing forever. Writing on boot guarantees the agent
523
- // loads current guidance on its next turn. Idempotent + version-gated.
524
- // (Cursor rules stay post-open: they're project-scoped and the project path
525
- // isn't known until the editor opens.)
526
- if (mcpEditor === 'claude' || mcpEditor === undefined) {
527
- (0, skillWriter_1.writeSkillFileIfNeeded)();
528
- }
516
+ /**
517
+ * Builds the fully configured Rivet MCP server (tools, auth gating, session
518
+ * bridge, telemetry) without binding it to a transport. Shared by the stdio
519
+ * and streamable-HTTP entry points. Call at most once per process: it
520
+ * registers process-level signal handlers for resource cleanup.
521
+ */
522
+ const createRivetMcp = (options) => {
523
+ const { mcpEditor, revokeBearerToken } = options ?? {};
529
524
  const sendButtonLabel = getSendButtonLabel(mcpEditor);
530
525
  const bridge = new SessionBridgeService_1.SessionBridgeService();
531
526
  const telemetry = new TelemetryService_1.TelemetryService({
@@ -1556,8 +1551,35 @@ If the Monitor tool is not available, call watch_for_changes({ sessionId: "${ses
1556
1551
  integrationsClient,
1557
1552
  });
1558
1553
  (0, tools_2.registerIntegrationsTools)(guardedMcp, { integrationsClient });
1559
- (0, tools_1.registerAuthTools)(mcp, { authService, telemetry, mcpEditor });
1554
+ (0, tools_1.registerAuthTools)(mcp, {
1555
+ authService,
1556
+ telemetry,
1557
+ mcpEditor,
1558
+ revokeBearerToken,
1559
+ });
1560
1560
  log.info('agent-variants + integrations + auth MCP tools registered');
1561
+ const closeActiveSession = async () => {
1562
+ await cleanupSessionResources({ trackSessionEnd: true });
1563
+ };
1564
+ return { mcp, closeActiveSession, shutdown };
1565
+ };
1566
+ exports.createRivetMcp = createRivetMcp;
1567
+ const startMCPServer = async (mcpEditor) => {
1568
+ // Default silent so MCP transport stays clean; opt in via env for debugging
1569
+ // (e.g. `RIVET_LOG_LEVEL=debug` in the MCP client's env block).
1570
+ (0, index_core_1.setLogLevel)(process.env.RIVET_LOG_LEVEL ?? 'SILENT');
1571
+ // Refresh the Claude skill at startup — NOT only after a successful
1572
+ // open_visual_editor (the other call sites below). Otherwise stale guidance
1573
+ // that refuses an action deadlocks: e.g. a v22 skill that won't open an empty
1574
+ // folder means open_visual_editor never runs, so the skill never rewrites,
1575
+ // so the agent keeps refusing forever. Writing on boot guarantees the agent
1576
+ // loads current guidance on its next turn. Idempotent + version-gated.
1577
+ // (Cursor rules stay post-open: they're project-scoped and the project path
1578
+ // isn't known until the editor opens.)
1579
+ if (mcpEditor === 'claude' || mcpEditor === undefined) {
1580
+ (0, skillWriter_1.writeSkillFileIfNeeded)();
1581
+ }
1582
+ const { mcp } = (0, exports.createRivetMcp)({ mcpEditor });
1561
1583
  // Connect via stdio
1562
1584
  const transport = new stdio_js_1.StdioServerTransport();
1563
1585
  await mcp.connect(transport);