rivet-design 0.9.9 → 0.10.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/config/flags.d.ts +3 -0
- package/dist/config/flags.d.ts.map +1 -1
- package/dist/config/flags.js +1 -0
- package/dist/config/flags.js.map +1 -1
- package/dist/config/proxy.d.ts +1 -0
- package/dist/config/proxy.d.ts.map +1 -1
- package/dist/config/proxy.js +9 -1
- package/dist/config/proxy.js.map +1 -1
- package/dist/demo/sessionRuntime.js +1 -1
- package/dist/demo/sessionRuntime.js.map +1 -1
- package/dist/hosted-demo.js +4 -1
- package/dist/hosted-demo.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/agent-variants/contracts.d.ts +50 -49
- package/dist/mcp/agent-variants/contracts.d.ts.map +1 -1
- package/dist/mcp/agent-variants/contracts.js.map +1 -1
- package/dist/mcp/agent-variants/createZeroToOneTool.d.ts +4 -4
- package/dist/mcp/agent-variants/createZeroToOneTool.js +1 -1
- package/dist/mcp/agent-variants/createZeroToOneTool.js.map +1 -1
- package/dist/mcp/agent-variants/tools.d.ts.map +1 -1
- package/dist/mcp/agent-variants/tools.js +36 -14
- package/dist/mcp/agent-variants/tools.js.map +1 -1
- package/dist/mcp/auth/tools.d.ts +36 -0
- package/dist/mcp/auth/tools.d.ts.map +1 -0
- package/dist/mcp/auth/tools.js +164 -0
- package/dist/mcp/auth/tools.js.map +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +23 -9
- package/dist/mcp/server.js.map +1 -1
- package/dist/prototype-host.d.ts +2 -0
- package/dist/prototype-host.d.ts.map +1 -0
- package/dist/prototype-host.js +56 -0
- package/dist/prototype-host.js.map +1 -0
- package/dist/routes/agentVariants.d.ts +2 -1
- package/dist/routes/agentVariants.d.ts.map +1 -1
- package/dist/routes/agentVariants.js +104 -1
- package/dist/routes/agentVariants.js.map +1 -1
- package/dist/routes/prototypeHost.d.ts +13 -0
- package/dist/routes/prototypeHost.d.ts.map +1 -0
- package/dist/routes/prototypeHost.js +207 -0
- package/dist/routes/prototypeHost.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +8 -2
- package/dist/server.js.map +1 -1
- package/dist/services/AuthService.d.ts +27 -1
- package/dist/services/AuthService.d.ts.map +1 -1
- package/dist/services/AuthService.js +302 -8
- package/dist/services/AuthService.js.map +1 -1
- package/dist/services/BundleStore.d.ts +36 -0
- package/dist/services/BundleStore.d.ts.map +1 -0
- package/dist/services/BundleStore.js +102 -0
- package/dist/services/BundleStore.js.map +1 -0
- package/dist/services/ConfigManager.d.ts +20 -2
- package/dist/services/ConfigManager.d.ts.map +1 -1
- package/dist/services/ConfigManager.js +46 -2
- package/dist/services/ConfigManager.js.map +1 -1
- package/dist/services/HostedDemoAuthSessionService.d.ts +2 -0
- package/dist/services/HostedDemoAuthSessionService.d.ts.map +1 -1
- package/dist/services/HostedDemoAuthSessionService.js.map +1 -1
- package/dist/services/HostedDemoAuthSessionStore.d.ts +1 -0
- package/dist/services/HostedDemoAuthSessionStore.d.ts.map +1 -1
- package/dist/services/HostedDemoAuthSessionStore.js.map +1 -1
- package/dist/services/PrototypeBuildService.d.ts +38 -0
- package/dist/services/PrototypeBuildService.d.ts.map +1 -0
- package/dist/services/PrototypeBuildService.js +165 -0
- package/dist/services/PrototypeBuildService.js.map +1 -0
- package/dist/services/PrototypeDeployService.d.ts +34 -0
- package/dist/services/PrototypeDeployService.d.ts.map +1 -0
- package/dist/services/PrototypeDeployService.js +115 -0
- package/dist/services/PrototypeDeployService.js.map +1 -0
- package/dist/services/RequestAuthContext.d.ts +1 -0
- package/dist/services/RequestAuthContext.d.ts.map +1 -1
- package/dist/services/RequestAuthContext.js.map +1 -1
- package/dist/services/SupabaseAuthService.d.ts +25 -0
- package/dist/services/SupabaseAuthService.d.ts.map +1 -0
- package/dist/services/SupabaseAuthService.js +56 -0
- package/dist/services/SupabaseAuthService.js.map +1 -0
- package/dist/services/TelemetryService.d.ts +26 -8
- package/dist/services/TelemetryService.d.ts.map +1 -1
- package/dist/services/TelemetryService.js +42 -20
- package/dist/services/TelemetryService.js.map +1 -1
- package/dist/services/VariantHistoryService.d.ts +23 -0
- package/dist/services/VariantHistoryService.d.ts.map +1 -1
- package/dist/services/VariantHistoryService.js +37 -1
- package/dist/services/VariantHistoryService.js.map +1 -1
- package/dist/services/accessTokenRefresh.d.ts +6 -0
- package/dist/services/accessTokenRefresh.d.ts.map +1 -1
- package/dist/services/accessTokenRefresh.js +27 -1
- package/dist/services/accessTokenRefresh.js.map +1 -1
- package/dist/utils/skills/claude-skill.js +1 -1
- package/dist/utils/skills/cursor-rules.js +1 -1
- package/dist/utils/skills/shared-variants-protocol.js +5 -5
- package/package.json +3 -2
- package/src/ui/dist/assets/{main-DXMHtjqM.js → main-CIJUZXe8.js} +120 -120
- package/src/ui/dist/index.html +1 -1
|
@@ -36,7 +36,160 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
exports.AuthService = void 0;
|
|
37
37
|
const logger_1 = require("../utils/logger");
|
|
38
38
|
const ConfigManager_1 = require("./ConfigManager");
|
|
39
|
+
const http_1 = require("http");
|
|
40
|
+
const accessTokenRefresh_1 = require("./accessTokenRefresh");
|
|
39
41
|
const log = (0, logger_1.createLogger)('AuthService');
|
|
42
|
+
const LOOPBACK_HOST = '127.0.0.1';
|
|
43
|
+
const LOOPBACK_PORT = 0;
|
|
44
|
+
const CALLBACK_COMPLETE_PATH = '/complete';
|
|
45
|
+
const OAUTH_CALLBACK_TIMEOUT_MS = 120_000;
|
|
46
|
+
const MAX_CALLBACK_BODY_BYTES = 64 * 1024;
|
|
47
|
+
/** Sends a small text response from the loopback OAuth callback server. */
|
|
48
|
+
const sendTextResponse = (response, statusCode, body) => {
|
|
49
|
+
response.statusCode = statusCode;
|
|
50
|
+
response.setHeader('Content-Type', 'text/html; charset=utf-8');
|
|
51
|
+
response.end(body);
|
|
52
|
+
};
|
|
53
|
+
/** Reads a bounded request body from the local OAuth callback server. */
|
|
54
|
+
const readRequestBody = (request) => {
|
|
55
|
+
return new Promise((resolve, reject) => {
|
|
56
|
+
let body = '';
|
|
57
|
+
request.on('data', (chunk) => {
|
|
58
|
+
body += chunk.toString('utf8');
|
|
59
|
+
if (Buffer.byteLength(body) > MAX_CALLBACK_BODY_BYTES) {
|
|
60
|
+
reject(new Error('OAuth callback payload too large'));
|
|
61
|
+
request.destroy();
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
request.on('end', () => resolve(body));
|
|
65
|
+
request.on('error', reject);
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
/** Serves the browser page that forwards OAuth hash tokens to localhost. */
|
|
69
|
+
const getLoopbackCallbackHtml = () => {
|
|
70
|
+
return `<!doctype html>
|
|
71
|
+
<html>
|
|
72
|
+
<head>
|
|
73
|
+
<meta charset="utf-8" />
|
|
74
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
75
|
+
<title>Rivet authentication</title>
|
|
76
|
+
<style>
|
|
77
|
+
body {
|
|
78
|
+
margin: 0;
|
|
79
|
+
min-height: 100vh;
|
|
80
|
+
display: grid;
|
|
81
|
+
place-items: center;
|
|
82
|
+
font-family: system-ui, sans-serif;
|
|
83
|
+
background: #0b0b0f;
|
|
84
|
+
color: #fff;
|
|
85
|
+
}
|
|
86
|
+
main {
|
|
87
|
+
max-width: 420px;
|
|
88
|
+
padding: 32px;
|
|
89
|
+
text-align: center;
|
|
90
|
+
}
|
|
91
|
+
</style>
|
|
92
|
+
</head>
|
|
93
|
+
<body>
|
|
94
|
+
<main>
|
|
95
|
+
<h1>Finishing Rivet sign in...</h1>
|
|
96
|
+
<p>You can return to your editor after this page completes.</p>
|
|
97
|
+
</main>
|
|
98
|
+
<script>
|
|
99
|
+
const params = new URLSearchParams(window.location.search);
|
|
100
|
+
const hash = new URLSearchParams(window.location.hash.slice(1));
|
|
101
|
+
if (window.location.hash) {
|
|
102
|
+
window.history.replaceState(
|
|
103
|
+
null,
|
|
104
|
+
document.title,
|
|
105
|
+
window.location.pathname + window.location.search
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
fetch('/complete', {
|
|
109
|
+
method: 'POST',
|
|
110
|
+
headers: { 'Content-Type': 'application/json' },
|
|
111
|
+
body: JSON.stringify({
|
|
112
|
+
sessionId: params.get('session'),
|
|
113
|
+
accessToken: hash.get('access_token'),
|
|
114
|
+
refreshToken: hash.get('refresh_token')
|
|
115
|
+
})
|
|
116
|
+
}).then((response) => {
|
|
117
|
+
document.querySelector('h1').textContent = response.ok
|
|
118
|
+
? 'Rivet sign in complete'
|
|
119
|
+
: 'Rivet sign in failed';
|
|
120
|
+
}).catch(() => {
|
|
121
|
+
document.querySelector('h1').textContent = 'Rivet sign in failed';
|
|
122
|
+
});
|
|
123
|
+
</script>
|
|
124
|
+
</body>
|
|
125
|
+
</html>`;
|
|
126
|
+
};
|
|
127
|
+
/** Creates a localhost OAuth callback endpoint for browserless MCP login. */
|
|
128
|
+
const createLoopbackOAuthCallback = async () => {
|
|
129
|
+
let resolveTokens = () => { };
|
|
130
|
+
let rejectTokens = () => { };
|
|
131
|
+
let timeout = null;
|
|
132
|
+
const clearCallbackTimeout = () => {
|
|
133
|
+
if (timeout) {
|
|
134
|
+
clearTimeout(timeout);
|
|
135
|
+
timeout = null;
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
const waitForTokens = new Promise((resolve, reject) => {
|
|
139
|
+
resolveTokens = resolve;
|
|
140
|
+
rejectTokens = reject;
|
|
141
|
+
timeout = setTimeout(() => {
|
|
142
|
+
timeout = null;
|
|
143
|
+
reject(new Error('OAuth callback timed out'));
|
|
144
|
+
}, OAUTH_CALLBACK_TIMEOUT_MS);
|
|
145
|
+
});
|
|
146
|
+
const server = (0, http_1.createServer)((request, response) => {
|
|
147
|
+
const url = new URL(request.url ?? '/', `http://${LOOPBACK_HOST}`);
|
|
148
|
+
if (request.method === 'GET') {
|
|
149
|
+
sendTextResponse(response, 200, getLoopbackCallbackHtml());
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (request.method !== 'POST' ||
|
|
153
|
+
url.pathname !== CALLBACK_COMPLETE_PATH) {
|
|
154
|
+
sendTextResponse(response, 404, 'Not found');
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
void readRequestBody(request)
|
|
158
|
+
.then((body) => {
|
|
159
|
+
const payload = JSON.parse(body);
|
|
160
|
+
if (!payload.sessionId || !payload.accessToken) {
|
|
161
|
+
throw new Error('OAuth callback missing session or token');
|
|
162
|
+
}
|
|
163
|
+
clearCallbackTimeout();
|
|
164
|
+
resolveTokens({
|
|
165
|
+
sessionId: payload.sessionId,
|
|
166
|
+
accessToken: payload.accessToken,
|
|
167
|
+
refreshToken: payload.refreshToken,
|
|
168
|
+
});
|
|
169
|
+
sendTextResponse(response, 200, 'Authentication complete');
|
|
170
|
+
})
|
|
171
|
+
.catch((error) => {
|
|
172
|
+
clearCallbackTimeout();
|
|
173
|
+
rejectTokens(error instanceof Error ? error : new Error(String(error)));
|
|
174
|
+
sendTextResponse(response, 400, 'Authentication failed');
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
await new Promise((resolve) => {
|
|
178
|
+
server.listen(LOOPBACK_PORT, LOOPBACK_HOST, () => resolve());
|
|
179
|
+
});
|
|
180
|
+
const address = server.address();
|
|
181
|
+
if (!address || typeof address === 'string') {
|
|
182
|
+
throw new Error('Unable to start OAuth callback server');
|
|
183
|
+
}
|
|
184
|
+
return {
|
|
185
|
+
redirectOrigin: `http://${LOOPBACK_HOST}:${address.port}`,
|
|
186
|
+
waitForTokens,
|
|
187
|
+
close: () => new Promise((resolve) => {
|
|
188
|
+
clearCallbackTimeout();
|
|
189
|
+
server.close(() => resolve());
|
|
190
|
+
}),
|
|
191
|
+
};
|
|
192
|
+
};
|
|
40
193
|
/**
|
|
41
194
|
* AuthService handles authentication with the Rivet proxy server
|
|
42
195
|
*/
|
|
@@ -77,7 +230,7 @@ class AuthService {
|
|
|
77
230
|
};
|
|
78
231
|
}
|
|
79
232
|
if (result.token && result.user?.email) {
|
|
80
|
-
this.configManager.setAuth(result.token, result.user.email, result.refreshToken);
|
|
233
|
+
this.configManager.setAuth(result.token, result.user.email, result.refreshToken, result.user.id);
|
|
81
234
|
log.info(`Signed in as ${result.user.email} (CI)`);
|
|
82
235
|
}
|
|
83
236
|
return result;
|
|
@@ -94,14 +247,36 @@ class AuthService {
|
|
|
94
247
|
/**
|
|
95
248
|
* Start Google OAuth flow
|
|
96
249
|
* Opens browser for user to authenticate, then polls for token.
|
|
250
|
+
*
|
|
251
|
+
* Accepts either a bare `redirectOrigin` string (legacy call sites) or an
|
|
252
|
+
* options object carrying the login `source`/`editor`/`version` recorded by
|
|
253
|
+
* the proxy for analytics + login_events.
|
|
97
254
|
* redirectOrigin: e.g. http://localhost:4000 or http://localhost:4000/rivet — OAuth callback redirects there with ?session= (used when Rivet runs on a dynamic port).
|
|
98
255
|
*/
|
|
99
|
-
async loginWithGoogle(
|
|
256
|
+
async loginWithGoogle(optionsOrRedirectOrigin) {
|
|
257
|
+
const options = typeof optionsOrRedirectOrigin === 'string'
|
|
258
|
+
? { redirectOrigin: optionsOrRedirectOrigin }
|
|
259
|
+
: optionsOrRedirectOrigin ?? {};
|
|
260
|
+
const requestOptions = { ...options };
|
|
261
|
+
let loopbackCallback = null;
|
|
100
262
|
try {
|
|
263
|
+
if (requestOptions.source === 'mcp' && !requestOptions.redirectOrigin) {
|
|
264
|
+
loopbackCallback = await createLoopbackOAuthCallback();
|
|
265
|
+
requestOptions.redirectOrigin = loopbackCallback.redirectOrigin;
|
|
266
|
+
}
|
|
101
267
|
log.info(`Requesting OAuth URL from: ${this.proxyUrl}/api/auth/google/start`);
|
|
102
268
|
const body = {};
|
|
103
|
-
if (redirectOrigin) {
|
|
104
|
-
body.redirectOrigin = redirectOrigin;
|
|
269
|
+
if (requestOptions.redirectOrigin) {
|
|
270
|
+
body.redirectOrigin = requestOptions.redirectOrigin;
|
|
271
|
+
}
|
|
272
|
+
if (requestOptions.source) {
|
|
273
|
+
body.source = requestOptions.source;
|
|
274
|
+
}
|
|
275
|
+
if (requestOptions.editor) {
|
|
276
|
+
body.editor = requestOptions.editor;
|
|
277
|
+
}
|
|
278
|
+
if (requestOptions.version) {
|
|
279
|
+
body.version = requestOptions.version;
|
|
105
280
|
}
|
|
106
281
|
// Request OAuth URL from proxy
|
|
107
282
|
const response = await fetch(`${this.proxyUrl}/api/auth/google/start`, {
|
|
@@ -127,9 +302,51 @@ class AuthService {
|
|
|
127
302
|
log.info('Waiting for authentication...');
|
|
128
303
|
// Poll for completion
|
|
129
304
|
const sessionId = result.sessionId;
|
|
130
|
-
const
|
|
305
|
+
const pollSecret = result.pollSecret;
|
|
306
|
+
const completionSecret = result.completionSecret;
|
|
307
|
+
if (!sessionId || !pollSecret) {
|
|
308
|
+
return {
|
|
309
|
+
success: false,
|
|
310
|
+
error: 'Invalid response from server',
|
|
311
|
+
message: 'Authentication response missing session or poll secret',
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
if (loopbackCallback) {
|
|
315
|
+
if (!completionSecret) {
|
|
316
|
+
return {
|
|
317
|
+
success: false,
|
|
318
|
+
error: 'Invalid response from server',
|
|
319
|
+
message: 'Authentication response missing completion secret',
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
const callbackTokens = await loopbackCallback.waitForTokens;
|
|
323
|
+
if (callbackTokens.sessionId !== sessionId) {
|
|
324
|
+
return {
|
|
325
|
+
success: false,
|
|
326
|
+
error: 'Invalid OAuth callback',
|
|
327
|
+
message: 'OAuth callback session did not match login session',
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
const completeResponse = await fetch(`${this.proxyUrl}/api/auth/google/complete`, {
|
|
331
|
+
method: 'POST',
|
|
332
|
+
headers: { 'Content-Type': 'application/json' },
|
|
333
|
+
body: JSON.stringify({
|
|
334
|
+
...callbackTokens,
|
|
335
|
+
completionSecret,
|
|
336
|
+
}),
|
|
337
|
+
});
|
|
338
|
+
const completeResult = await completeResponse.json();
|
|
339
|
+
if (!completeResponse.ok || !completeResult.success) {
|
|
340
|
+
return {
|
|
341
|
+
success: false,
|
|
342
|
+
error: completeResult.error || 'Authentication failed',
|
|
343
|
+
message: completeResult.message,
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
const tokenResult = await this.pollForToken(sessionId, pollSecret);
|
|
131
348
|
if (tokenResult.success && tokenResult.token && tokenResult.user) {
|
|
132
|
-
this.configManager.setAuth(tokenResult.token, tokenResult.user.email, tokenResult.refreshToken);
|
|
349
|
+
this.configManager.setAuth(tokenResult.token, tokenResult.user.email, tokenResult.refreshToken, tokenResult.user.id);
|
|
133
350
|
log.info(`Logged in as ${tokenResult.user.email}`);
|
|
134
351
|
}
|
|
135
352
|
return tokenResult;
|
|
@@ -142,14 +359,24 @@ class AuthService {
|
|
|
142
359
|
message: error instanceof Error ? error.message : 'Unknown error occurred',
|
|
143
360
|
};
|
|
144
361
|
}
|
|
362
|
+
finally {
|
|
363
|
+
await loopbackCallback?.close();
|
|
364
|
+
}
|
|
145
365
|
}
|
|
146
366
|
/**
|
|
147
367
|
* Poll the proxy server for authentication token after OAuth
|
|
148
368
|
*/
|
|
149
|
-
async pollForToken(sessionId, maxAttempts = 60) {
|
|
369
|
+
async pollForToken(sessionId, pollSecret, maxAttempts = 60) {
|
|
150
370
|
for (let i = 0; i < maxAttempts; i++) {
|
|
151
371
|
try {
|
|
152
|
-
const response = await fetch(`${this.proxyUrl}/api/auth/google/token
|
|
372
|
+
const response = await fetch(`${this.proxyUrl}/api/auth/google/token`, {
|
|
373
|
+
method: 'POST',
|
|
374
|
+
headers: { 'Content-Type': 'application/json' },
|
|
375
|
+
body: JSON.stringify({
|
|
376
|
+
session: sessionId,
|
|
377
|
+
pollSecret,
|
|
378
|
+
}),
|
|
379
|
+
});
|
|
153
380
|
const result = await response.json();
|
|
154
381
|
if (result.success) {
|
|
155
382
|
return result;
|
|
@@ -223,6 +450,73 @@ class AuthService {
|
|
|
223
450
|
return null;
|
|
224
451
|
}
|
|
225
452
|
}
|
|
453
|
+
/**
|
|
454
|
+
* Server-validates auth for per-tool MCP gating. A local token only counts as
|
|
455
|
+
* authenticated after the proxy accepts it, and rejected tokens get one
|
|
456
|
+
* refresh-and-retry attempt through `getValidatedProfile()`.
|
|
457
|
+
*/
|
|
458
|
+
async ensureAuthenticated() {
|
|
459
|
+
const profile = await this.getValidatedProfile();
|
|
460
|
+
return profile !== null;
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* Server-validated auth check: fetch the profile, and if the token is
|
|
464
|
+
* rejected (401), refresh once and retry. Returns the profile when the user
|
|
465
|
+
* is genuinely authenticated, otherwise null. Use this instead of
|
|
466
|
+
* `isAuthenticated()` (which only checks for a token's presence) wherever a
|
|
467
|
+
* stale token must be treated as logged-out.
|
|
468
|
+
*/
|
|
469
|
+
async getValidatedProfile() {
|
|
470
|
+
const token = this.configManager.getAuthToken();
|
|
471
|
+
if (!token) {
|
|
472
|
+
return null;
|
|
473
|
+
}
|
|
474
|
+
const fetchProfile = async (bearer) => {
|
|
475
|
+
const response = await fetch(`${this.proxyUrl}/api/user/profile`, {
|
|
476
|
+
method: 'GET',
|
|
477
|
+
headers: {
|
|
478
|
+
'Content-Type': 'application/json',
|
|
479
|
+
Authorization: `Bearer ${bearer}`,
|
|
480
|
+
},
|
|
481
|
+
});
|
|
482
|
+
if (!response.ok) {
|
|
483
|
+
return { status: response.status, profile: null };
|
|
484
|
+
}
|
|
485
|
+
const result = await response.json().catch(() => null);
|
|
486
|
+
return {
|
|
487
|
+
status: response.status,
|
|
488
|
+
profile: result?.success ? result : null,
|
|
489
|
+
};
|
|
490
|
+
};
|
|
491
|
+
try {
|
|
492
|
+
const first = await fetchProfile(token);
|
|
493
|
+
if (first.profile) {
|
|
494
|
+
return first.profile;
|
|
495
|
+
}
|
|
496
|
+
if (first.status !== 401) {
|
|
497
|
+
return null;
|
|
498
|
+
}
|
|
499
|
+
// Token rejected — try a single refresh, then retry.
|
|
500
|
+
const refreshToken = this.configManager.getRefreshToken();
|
|
501
|
+
if (!refreshToken) {
|
|
502
|
+
return null;
|
|
503
|
+
}
|
|
504
|
+
const refreshed = await (0, accessTokenRefresh_1.refreshAccessTokenViaProxy)({
|
|
505
|
+
refreshToken,
|
|
506
|
+
proxyUrl: this.proxyUrl,
|
|
507
|
+
});
|
|
508
|
+
if (!refreshed) {
|
|
509
|
+
return null;
|
|
510
|
+
}
|
|
511
|
+
this.configManager.setAuth(refreshed.token, this.configManager.getEmail() || '', refreshed.refreshToken);
|
|
512
|
+
const retry = await fetchProfile(refreshed.token);
|
|
513
|
+
return retry.profile;
|
|
514
|
+
}
|
|
515
|
+
catch (error) {
|
|
516
|
+
log.warn('Validated profile fetch error:', error);
|
|
517
|
+
return null;
|
|
518
|
+
}
|
|
519
|
+
}
|
|
226
520
|
/**
|
|
227
521
|
* Check if user is authenticated
|
|
228
522
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthService.js","sourceRoot":"","sources":["../../src/services/AuthService.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AuthService.js","sourceRoot":"","sources":["../../src/services/AuthService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/** One file in a prototype bundle. `path` is POSIX-relative to the bundle root
|
|
2
|
+
* (e.g. `assets/index-abc.js`); `content` is base64-encoded bytes. This is the
|
|
3
|
+
* wire shape the client uploads and the host stores — kept dependency-free so
|
|
4
|
+
* no tar/zip library is needed on either side. */
|
|
5
|
+
export interface BundleFile {
|
|
6
|
+
path: string;
|
|
7
|
+
content: string;
|
|
8
|
+
}
|
|
9
|
+
export interface BundleStore {
|
|
10
|
+
/** Write a bundle's files under `deployId`. Overwrites any prior content. */
|
|
11
|
+
put(deployId: string, files: BundleFile[]): Promise<void>;
|
|
12
|
+
/** Read a single asset (already validated/normalized by the caller's router).
|
|
13
|
+
* Returns null when the bundle or asset doesn't exist. */
|
|
14
|
+
read(deployId: string, assetPath: string): Promise<Buffer | null>;
|
|
15
|
+
/** True when a bundle directory exists for `deployId`. */
|
|
16
|
+
has(deployId: string): Promise<boolean>;
|
|
17
|
+
/** Absolute on-disk root for a bundle (used by the static-serving worker). */
|
|
18
|
+
rootFor(deployId: string): string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Filesystem-backed bundle store. Extracts each uploaded file under
|
|
22
|
+
* `<root>/<deployId>/`. Single-instance only (a Render persistent disk is not
|
|
23
|
+
* shared across instances) — fine for the MVP; swap for object storage later
|
|
24
|
+
* behind this same interface.
|
|
25
|
+
*/
|
|
26
|
+
export declare class DiskBundleStore implements BundleStore {
|
|
27
|
+
private readonly root;
|
|
28
|
+
constructor(root: string);
|
|
29
|
+
rootFor(deployId: string): string;
|
|
30
|
+
put(deployId: string, files: BundleFile[]): Promise<void>;
|
|
31
|
+
has(deployId: string): Promise<boolean>;
|
|
32
|
+
read(deployId: string, assetPath: string): Promise<Buffer | null>;
|
|
33
|
+
}
|
|
34
|
+
/** Best-effort check that the configured bundle root is writable at boot. */
|
|
35
|
+
export declare const ensureBundleRoot: (root: string) => Promise<void>;
|
|
36
|
+
//# sourceMappingURL=BundleStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BundleStore.d.ts","sourceRoot":"","sources":["../../src/services/BundleStore.ts"],"names":[],"mappings":"AAOA;;;mDAGmD;AACnD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAeD,MAAM,WAAW,WAAW;IAC1B,6EAA6E;IAC7E,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D;+DAC2D;IAC3D,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAClE,0DAA0D;IAC1D,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxC,8EAA8E;IAC9E,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;CACnC;AAED;;;;;GAKG;AACH,qBAAa,eAAgB,YAAW,WAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,MAAM;IAEzC,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAI3B,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BzD,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASvC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAgBxE;AAED,6EAA6E;AAC7E,eAAO,MAAM,gBAAgB,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,IAAI,CAKjE,CAAC"}
|
|
@@ -0,0 +1,102 @@
|
|
|
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.ensureBundleRoot = exports.DiskBundleStore = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const logger_1 = require("../utils/logger");
|
|
11
|
+
const log = (0, logger_1.createLogger)('BundleStore');
|
|
12
|
+
/** Reject paths that try to escape the bundle root. Mirrors the lexical
|
|
13
|
+
* containment + traversal checks used in VariantHistoryService. */
|
|
14
|
+
const assertSafeBundlePath = (relPath) => {
|
|
15
|
+
if (relPath.length === 0 ||
|
|
16
|
+
relPath.includes('\0') ||
|
|
17
|
+
path_1.default.isAbsolute(relPath) ||
|
|
18
|
+
relPath.split(/[\\/]+/).some((part) => part === '..')) {
|
|
19
|
+
throw new Error(`BundleStore: invalid bundle path '${relPath}'`);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Filesystem-backed bundle store. Extracts each uploaded file under
|
|
24
|
+
* `<root>/<deployId>/`. Single-instance only (a Render persistent disk is not
|
|
25
|
+
* shared across instances) — fine for the MVP; swap for object storage later
|
|
26
|
+
* behind this same interface.
|
|
27
|
+
*/
|
|
28
|
+
class DiskBundleStore {
|
|
29
|
+
root;
|
|
30
|
+
constructor(root) {
|
|
31
|
+
this.root = root;
|
|
32
|
+
}
|
|
33
|
+
rootFor(deployId) {
|
|
34
|
+
return path_1.default.join(this.root, deployId);
|
|
35
|
+
}
|
|
36
|
+
async put(deployId, files) {
|
|
37
|
+
const bundleRoot = this.rootFor(deployId);
|
|
38
|
+
// Stage then atomically swap so a partially written bundle is never served.
|
|
39
|
+
const stagingRoot = `${bundleRoot}.tmp-${process.pid}-${Date.now()}`;
|
|
40
|
+
await promises_1.default.rm(stagingRoot, { recursive: true, force: true });
|
|
41
|
+
await promises_1.default.mkdir(stagingRoot, { recursive: true });
|
|
42
|
+
try {
|
|
43
|
+
for (const file of files) {
|
|
44
|
+
assertSafeBundlePath(file.path);
|
|
45
|
+
const target = path_1.default.join(stagingRoot, file.path);
|
|
46
|
+
// Defense in depth: ensure the resolved path is still inside staging.
|
|
47
|
+
const rel = path_1.default.relative(stagingRoot, target);
|
|
48
|
+
if (rel.startsWith('..') || path_1.default.isAbsolute(rel)) {
|
|
49
|
+
throw new Error(`BundleStore: path escapes bundle root '${file.path}'`);
|
|
50
|
+
}
|
|
51
|
+
await promises_1.default.mkdir(path_1.default.dirname(target), { recursive: true });
|
|
52
|
+
await promises_1.default.writeFile(target, Buffer.from(file.content, 'base64'));
|
|
53
|
+
}
|
|
54
|
+
await promises_1.default.rm(bundleRoot, { recursive: true, force: true });
|
|
55
|
+
await promises_1.default.rename(stagingRoot, bundleRoot);
|
|
56
|
+
log.info(`Stored bundle ${deployId} (${files.length} files)`);
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
await promises_1.default.rm(stagingRoot, { recursive: true, force: true });
|
|
60
|
+
throw err;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async has(deployId) {
|
|
64
|
+
try {
|
|
65
|
+
const stat = await promises_1.default.stat(this.rootFor(deployId));
|
|
66
|
+
return stat.isDirectory();
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async read(deployId, assetPath) {
|
|
73
|
+
assertSafeBundlePath(assetPath);
|
|
74
|
+
const bundleRoot = this.rootFor(deployId);
|
|
75
|
+
const target = path_1.default.join(bundleRoot, assetPath);
|
|
76
|
+
const rel = path_1.default.relative(bundleRoot, target);
|
|
77
|
+
if (rel.startsWith('..') || path_1.default.isAbsolute(rel))
|
|
78
|
+
return null;
|
|
79
|
+
try {
|
|
80
|
+
const stat = await promises_1.default.stat(target);
|
|
81
|
+
if (!stat.isFile())
|
|
82
|
+
return null;
|
|
83
|
+
return await promises_1.default.readFile(target);
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
const code = err.code;
|
|
87
|
+
if (code !== 'ENOENT')
|
|
88
|
+
log.warn(`read failed for ${deployId}/${assetPath}`, err);
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
exports.DiskBundleStore = DiskBundleStore;
|
|
94
|
+
/** Best-effort check that the configured bundle root is writable at boot. */
|
|
95
|
+
const ensureBundleRoot = async (root) => {
|
|
96
|
+
await promises_1.default.mkdir(root, { recursive: true });
|
|
97
|
+
if (!fs_1.default.existsSync(root)) {
|
|
98
|
+
throw new Error(`BundleStore: bundle root '${root}' could not be created`);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
exports.ensureBundleRoot = ensureBundleRoot;
|
|
102
|
+
//# sourceMappingURL=BundleStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BundleStore.js","sourceRoot":"","sources":["../../src/services/BundleStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,9 +2,11 @@ type RivetConfig = {
|
|
|
2
2
|
authToken?: string;
|
|
3
3
|
refreshToken?: string;
|
|
4
4
|
email?: string;
|
|
5
|
+
userId?: string;
|
|
5
6
|
proxyUrl?: string;
|
|
6
7
|
anonymousId?: string;
|
|
7
8
|
telemetryIdentifiedEmail?: string;
|
|
9
|
+
telemetryIdentifiedUserId?: string;
|
|
8
10
|
};
|
|
9
11
|
/**
|
|
10
12
|
* ConfigManager handles local storage of Rivet configuration
|
|
@@ -23,9 +25,12 @@ declare class ConfigManager {
|
|
|
23
25
|
*/
|
|
24
26
|
private saveConfig;
|
|
25
27
|
/**
|
|
26
|
-
* Set authentication tokens and
|
|
28
|
+
* Set authentication tokens, email, and (optionally) the Supabase user id.
|
|
29
|
+
* `userId` is the canonical cross-surface identity — when omitted, an
|
|
30
|
+
* existing stored value is preserved (callers that don't have it shouldn't
|
|
31
|
+
* clobber it).
|
|
27
32
|
*/
|
|
28
|
-
setAuth(token: string, email: string, refreshToken?: string): void;
|
|
33
|
+
setAuth(token: string, email: string, refreshToken?: string, userId?: string): void;
|
|
29
34
|
/**
|
|
30
35
|
* Get authentication token
|
|
31
36
|
*/
|
|
@@ -38,6 +43,13 @@ declare class ConfigManager {
|
|
|
38
43
|
* Get user email
|
|
39
44
|
*/
|
|
40
45
|
getEmail(): string | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Get the canonical Supabase user id. Falls back to the request-scoped
|
|
48
|
+
* context, then to the stored value, and finally backfills it by decoding
|
|
49
|
+
* the `sub` claim of the stored access token (no verification — we already
|
|
50
|
+
* trust the token locally). Backfill persists so we only decode once.
|
|
51
|
+
*/
|
|
52
|
+
getUserId(): string | undefined;
|
|
41
53
|
/**
|
|
42
54
|
* Check if user is authenticated
|
|
43
55
|
*/
|
|
@@ -62,6 +74,12 @@ declare class ConfigManager {
|
|
|
62
74
|
*/
|
|
63
75
|
getTelemetryIdentifiedEmail(): string | undefined;
|
|
64
76
|
setTelemetryIdentifiedEmail(email: string): void;
|
|
77
|
+
/**
|
|
78
|
+
* Supabase user id last identified to PostHog. Used to suppress redundant
|
|
79
|
+
* alias/identify calls once analytics identity is keyed on user id.
|
|
80
|
+
*/
|
|
81
|
+
getTelemetryIdentifiedUserId(): string | undefined;
|
|
82
|
+
setTelemetryIdentifiedUserId(userId: string): void;
|
|
65
83
|
/**
|
|
66
84
|
* Get proxy URL
|
|
67
85
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigManager.d.ts","sourceRoot":"","sources":["../../src/services/ConfigManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ConfigManager.d.ts","sourceRoot":"","sources":["../../src/services/ConfigManager.ts"],"names":[],"mappings":"AAWA,KAAK,WAAW,GAAG;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACpC,CAAC;AAEF;;;GAGG;AACH,cAAM,aAAa;IACjB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAc;;IAiB5B;;OAEG;IACH,OAAO,CAAC,UAAU;IAalB;;OAEG;IACH,OAAO,CAAC,UAAU;IAYlB;;;;;OAKG;IACH,OAAO,CACL,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,YAAY,CAAC,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,MAAM,GACd,IAAI;IAWP;;OAEG;IACH,YAAY,IAAI,MAAM,GAAG,SAAS;IAQlC;;OAEG;IACH,eAAe,IAAI,MAAM,GAAG,SAAS;IAQrC;;OAEG;IACH,QAAQ,IAAI,MAAM,GAAG,SAAS;IAQ9B;;;;;OAKG;IACH,SAAS,IAAI,MAAM,GAAG,SAAS;IAmB/B;;OAEG;IACH,eAAe,IAAI,OAAO;IAI1B;;OAEG;IACH,SAAS,IAAI,IAAI;IAWjB;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAM9B;;;OAGG;IACH,cAAc,IAAI,MAAM;IASxB;;;;OAIG;IACH,2BAA2B,IAAI,MAAM,GAAG,SAAS;IAIjD,2BAA2B,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKhD;;;OAGG;IACH,4BAA4B,IAAI,MAAM,GAAG,SAAS;IAIlD,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKlD;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACH,SAAS,IAAI,WAAW;IAIxB;;OAEG;IACH,aAAa,IAAI,MAAM;CAGxB;AAKD,eAAO,MAAM,gBAAgB,QAAO,aAKnC,CAAC"}
|