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.
- package/dist/index.d.ts +47 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +277 -123
- package/dist/index.js.map +1 -1
- package/dist/mcp/agent-variants/SessionStore.d.ts +28 -4
- package/dist/mcp/agent-variants/SessionStore.d.ts.map +1 -1
- package/dist/mcp/agent-variants/SessionStore.js +356 -123
- package/dist/mcp/agent-variants/SessionStore.js.map +1 -1
- package/dist/mcp/agent-variants/WorktreeOrchestrator.d.ts +84 -4
- package/dist/mcp/agent-variants/WorktreeOrchestrator.d.ts.map +1 -1
- package/dist/mcp/agent-variants/WorktreeOrchestrator.js +744 -145
- package/dist/mcp/agent-variants/WorktreeOrchestrator.js.map +1 -1
- package/dist/mcp/agent-variants/WorktreeOrchestrator.testHelpers.d.ts +8 -3
- package/dist/mcp/agent-variants/WorktreeOrchestrator.testHelpers.d.ts.map +1 -1
- package/dist/mcp/agent-variants/WorktreeOrchestrator.testHelpers.js +8 -3
- package/dist/mcp/agent-variants/WorktreeOrchestrator.testHelpers.js.map +1 -1
- package/dist/mcp/agent-variants/contracts.d.ts +7984 -1625
- package/dist/mcp/agent-variants/contracts.d.ts.map +1 -1
- package/dist/mcp/agent-variants/contracts.js +312 -154
- package/dist/mcp/agent-variants/contracts.js.map +1 -1
- package/dist/mcp/agent-variants/createZeroToOneTool.d.ts +2 -3
- package/dist/mcp/agent-variants/createZeroToOneTool.d.ts.map +1 -1
- package/dist/mcp/agent-variants/createZeroToOneTool.js +49 -39
- package/dist/mcp/agent-variants/createZeroToOneTool.js.map +1 -1
- package/dist/mcp/agent-variants/designCritique.d.ts +167 -0
- package/dist/mcp/agent-variants/designCritique.d.ts.map +1 -0
- package/dist/mcp/agent-variants/designCritique.js +717 -0
- package/dist/mcp/agent-variants/designCritique.js.map +1 -0
- package/dist/mcp/agent-variants/diffQa.d.ts +7 -0
- package/dist/mcp/agent-variants/diffQa.d.ts.map +1 -0
- package/dist/mcp/agent-variants/diffQa.js +67 -0
- package/dist/mcp/agent-variants/diffQa.js.map +1 -0
- package/dist/mcp/agent-variants/index.d.ts +3 -3
- package/dist/mcp/agent-variants/index.d.ts.map +1 -1
- package/dist/mcp/agent-variants/index.js +2 -1
- package/dist/mcp/agent-variants/index.js.map +1 -1
- package/dist/mcp/agent-variants/pinterestSourceContext.d.ts +4 -2
- package/dist/mcp/agent-variants/pinterestSourceContext.d.ts.map +1 -1
- package/dist/mcp/agent-variants/pinterestSourceContext.js +7 -6
- package/dist/mcp/agent-variants/pinterestSourceContext.js.map +1 -1
- package/dist/mcp/agent-variants/previewQa.d.ts +6 -4
- package/dist/mcp/agent-variants/previewQa.d.ts.map +1 -1
- package/dist/mcp/agent-variants/previewQa.js +140 -13
- package/dist/mcp/agent-variants/previewQa.js.map +1 -1
- package/dist/mcp/agent-variants/sourceContext.d.ts +20 -5
- package/dist/mcp/agent-variants/sourceContext.d.ts.map +1 -1
- package/dist/mcp/agent-variants/sourceContext.js +99 -115
- package/dist/mcp/agent-variants/sourceContext.js.map +1 -1
- package/dist/mcp/agent-variants/tools.d.ts +7 -0
- package/dist/mcp/agent-variants/tools.d.ts.map +1 -1
- package/dist/mcp/agent-variants/tools.js +216 -15
- package/dist/mcp/agent-variants/tools.js.map +1 -1
- package/dist/mcp/agent-variants/variantContext.d.ts +19 -0
- package/dist/mcp/agent-variants/variantContext.d.ts.map +1 -0
- package/dist/mcp/agent-variants/variantContext.js +355 -0
- package/dist/mcp/agent-variants/variantContext.js.map +1 -0
- package/dist/mcp/auth/httpOAuthProvider.d.ts +103 -0
- package/dist/mcp/auth/httpOAuthProvider.d.ts.map +1 -0
- package/dist/mcp/auth/httpOAuthProvider.js +454 -0
- package/dist/mcp/auth/httpOAuthProvider.js.map +1 -0
- package/dist/mcp/auth/tools.d.ts +2 -0
- package/dist/mcp/auth/tools.d.ts.map +1 -1
- package/dist/mcp/auth/tools.js +12 -5
- package/dist/mcp/auth/tools.js.map +1 -1
- package/dist/mcp/httpServer.d.ts +36 -0
- package/dist/mcp/httpServer.d.ts.map +1 -0
- package/dist/mcp/httpServer.js +307 -0
- package/dist/mcp/httpServer.js.map +1 -0
- package/dist/mcp/server.d.ts +17 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +41 -19
- package/dist/mcp/server.js.map +1 -1
- package/dist/proxy-middleware/proxy-config.d.ts.map +1 -1
- package/dist/proxy-middleware/proxy-config.js +5 -2
- package/dist/proxy-middleware/proxy-config.js.map +1 -1
- package/dist/routes/agentVariants.d.ts.map +1 -1
- package/dist/routes/agentVariants.js +6 -4
- package/dist/routes/agentVariants.js.map +1 -1
- package/dist/routes/mcp.d.ts.map +1 -1
- package/dist/routes/mcp.js +2 -1
- package/dist/routes/mcp.js.map +1 -1
- package/dist/server.d.ts +9 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +13 -5
- package/dist/server.js.map +1 -1
- package/dist/services/AuthService.d.ts +1 -0
- package/dist/services/AuthService.d.ts.map +1 -1
- package/dist/services/AuthService.js +11 -1
- package/dist/services/AuthService.js.map +1 -1
- package/dist/services/BrowserAgentClient.d.ts +54 -0
- package/dist/services/BrowserAgentClient.d.ts.map +1 -0
- package/dist/services/BrowserAgentClient.js +126 -0
- package/dist/services/BrowserAgentClient.js.map +1 -0
- package/dist/services/ConfigManager.d.ts +5 -0
- package/dist/services/ConfigManager.d.ts.map +1 -1
- package/dist/services/ConfigManager.js +25 -3
- package/dist/services/ConfigManager.js.map +1 -1
- package/dist/services/DevServerRuntimeService.d.ts +119 -0
- package/dist/services/DevServerRuntimeService.d.ts.map +1 -0
- package/dist/services/DevServerRuntimeService.js +657 -0
- package/dist/services/DevServerRuntimeService.js.map +1 -0
- package/dist/services/GatewayClient.d.ts +25 -0
- package/dist/services/GatewayClient.d.ts.map +1 -1
- package/dist/services/GatewayClient.js +70 -11
- package/dist/services/GatewayClient.js.map +1 -1
- package/dist/services/InlineVariantGenerationService.d.ts +2 -0
- package/dist/services/InlineVariantGenerationService.d.ts.map +1 -1
- package/dist/services/InlineVariantGenerationService.js +70 -3
- package/dist/services/InlineVariantGenerationService.js.map +1 -1
- package/dist/services/RequestAuthContext.d.ts +7 -1
- package/dist/services/RequestAuthContext.d.ts.map +1 -1
- package/dist/services/RequestAuthContext.js +15 -2
- package/dist/services/RequestAuthContext.js.map +1 -1
- package/dist/services/SessionBridgeService.d.ts +1 -0
- package/dist/services/SessionBridgeService.d.ts.map +1 -1
- package/dist/services/SessionBridgeService.js +16 -1
- package/dist/services/SessionBridgeService.js.map +1 -1
- package/dist/services/VariantRunService.d.ts +1 -0
- package/dist/services/VariantRunService.d.ts.map +1 -1
- package/dist/services/VariantRunService.js +1 -0
- package/dist/services/VariantRunService.js.map +1 -1
- package/dist/services/VariantsRuntime.d.ts.map +1 -1
- package/dist/services/VariantsRuntime.js +1 -0
- package/dist/services/VariantsRuntime.js.map +1 -1
- package/dist/services/WorktreeManager.d.ts +1 -8
- package/dist/services/WorktreeManager.d.ts.map +1 -1
- package/dist/services/WorktreeManager.js +1 -28
- package/dist/services/WorktreeManager.js.map +1 -1
- package/dist/services/createAgentVariantsOrchestrator.d.ts.map +1 -1
- package/dist/services/createAgentVariantsOrchestrator.js +7 -0
- package/dist/services/createAgentVariantsOrchestrator.js.map +1 -1
- package/dist/utils/skills/describe-motion-protocol.d.ts +2 -3
- package/dist/utils/skills/describe-motion-protocol.d.ts.map +1 -1
- package/dist/utils/skills/describe-motion-protocol.js +50 -35
- package/dist/utils/skills/describe-motion-protocol.js.map +1 -1
- package/dist/utils/skills/shared-variants-protocol.d.ts +1 -1
- package/dist/utils/skills/shared-variants-protocol.d.ts.map +1 -1
- package/dist/utils/skills/shared-variants-protocol.js +21 -15
- package/dist/utils/skills/shared-variants-protocol.js.map +1 -1
- package/dist/utils/variantSessionStart.d.ts +3 -0
- package/dist/utils/variantSessionStart.d.ts.map +1 -0
- package/dist/utils/variantSessionStart.js +7 -0
- package/dist/utils/variantSessionStart.js.map +1 -0
- package/package.json +2 -1
- package/src/ui/dist/assets/{main-WqlDU4Ou.js → main-Cw6Pd8ye.js} +204 -204
- package/src/ui/dist/assets/main-DkCj7b2K.css +1 -0
- package/src/ui/dist/index.html +2 -2
- package/dist/mcp/agent-variants/designContextStore.d.ts +0 -160
- package/dist/mcp/agent-variants/designContextStore.d.ts.map +0 -1
- package/dist/mcp/agent-variants/designContextStore.js +0 -295
- package/dist/mcp/agent-variants/designContextStore.js.map +0 -1
- package/dist/mcp/agent-variants/inspirationDesignContext.d.ts +0 -440
- package/dist/mcp/agent-variants/inspirationDesignContext.d.ts.map +0 -1
- package/dist/mcp/agent-variants/inspirationDesignContext.js +0 -2467
- package/dist/mcp/agent-variants/inspirationDesignContext.js.map +0 -1
- 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":"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"}
|
package/dist/mcp/server.d.ts
CHANGED
|
@@ -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
|
package/dist/mcp/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/mcp/server.js
CHANGED
|
@@ -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
|
-
'
|
|
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
|
-
'
|
|
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
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
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, {
|
|
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);
|