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,355 @@
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.writeVariantContextBundle = exports.createVariantContextBundle = void 0;
7
+ const crypto_1 = __importDefault(require("crypto"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const os_1 = __importDefault(require("os"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const errors_1 = require("./errors");
12
+ const sourceContext_1 = require("./sourceContext");
13
+ const USER_CONTEXT_DIRECTORY = 'user';
14
+ const METADATA_DIRECTORY = 'metadata';
15
+ const CONTEXT_FILE = 'context.json';
16
+ const PROMPT_FILE = 'prompt.md';
17
+ const MAX_FILE_CONTEXT_BYTES = 50 * 1024 * 1024;
18
+ const UPLOAD_DATA_URL_PATTERN = /^data:([^;,]+);base64,(.*)$/s;
19
+ const BASE64_PAYLOAD_PATTERN = /^[A-Za-z0-9+/=\s]+$/;
20
+ const SUPPORTED_UPLOAD_IMAGE_EXTENSIONS = new Map([
21
+ ['image/png', 'png'],
22
+ ['image/jpeg', 'jpg'],
23
+ ['image/webp', 'webp'],
24
+ ['image/gif', 'gif'],
25
+ ['image/avif', 'avif'],
26
+ ]);
27
+ const ensureDir = (dir) => {
28
+ fs_1.default.mkdirSync(dir, { recursive: true });
29
+ };
30
+ const writeTextFile = (filePath, content) => {
31
+ ensureDir(path_1.default.dirname(filePath));
32
+ fs_1.default.writeFileSync(filePath, content, 'utf8');
33
+ };
34
+ const sha256File = (filePath) => {
35
+ const hash = crypto_1.default.createHash('sha256');
36
+ hash.update(fs_1.default.readFileSync(filePath));
37
+ return hash.digest('hex');
38
+ };
39
+ const safeNamePart = (value, fallback) => {
40
+ const base = (value ?? fallback)
41
+ .replace(/[^a-zA-Z0-9._-]+/g, '-')
42
+ .replace(/^-+|-+$/g, '')
43
+ .slice(0, 80);
44
+ return base || fallback;
45
+ };
46
+ const realpathIfPresent = (candidate) => {
47
+ try {
48
+ return fs_1.default.realpathSync(candidate);
49
+ }
50
+ catch {
51
+ return null;
52
+ }
53
+ };
54
+ const isPathWithinRoot = (absolutePath, root) => {
55
+ const relative = path_1.default.relative(root, absolutePath);
56
+ return (relative === '' ||
57
+ (relative.length > 0 &&
58
+ !relative.startsWith('..') &&
59
+ !path_1.default.isAbsolute(relative)));
60
+ };
61
+ const isBroadAllowedRoot = (root) => {
62
+ const resolvedRoot = path_1.default.resolve(root);
63
+ const filesystemRoot = path_1.default.parse(resolvedRoot).root;
64
+ const homeRoot = realpathIfPresent(os_1.default.homedir()) ?? path_1.default.resolve(os_1.default.homedir());
65
+ const tempRoot = realpathIfPresent(os_1.default.tmpdir()) ?? path_1.default.resolve(os_1.default.tmpdir());
66
+ return (resolvedRoot === filesystemRoot ||
67
+ resolvedRoot === homeRoot ||
68
+ resolvedRoot === tempRoot);
69
+ };
70
+ const resolveAllowedRoots = (roots) => roots
71
+ .map((root) => realpathIfPresent(root))
72
+ .filter((root) => {
73
+ if (!root)
74
+ return false;
75
+ return !isBroadAllowedRoot(root);
76
+ });
77
+ const readStoredUserContext = (contextBundlePath) => {
78
+ const manifestPath = path_1.default.join(contextBundlePath, CONTEXT_FILE);
79
+ try {
80
+ const manifest = JSON.parse(fs_1.default.readFileSync(manifestPath, 'utf8'));
81
+ if (!Array.isArray(manifest.storedUserContext))
82
+ return undefined;
83
+ return manifest.storedUserContext;
84
+ }
85
+ catch {
86
+ return undefined;
87
+ }
88
+ };
89
+ const assertAllowedPath = (sourcePath, allowedRoots) => {
90
+ const resolvedPath = realpathIfPresent(sourcePath);
91
+ if (!resolvedPath) {
92
+ throw new errors_1.AgentVariantsError('SOURCE_CONTEXT_INVALID', `User context path is not readable: ${sourcePath}`);
93
+ }
94
+ const isAllowed = allowedRoots.some((root) => isPathWithinRoot(resolvedPath, root));
95
+ if (!isAllowed) {
96
+ throw new errors_1.AgentVariantsError('SOURCE_CONTEXT_INVALID', `User context path escapes the allowed roots: ${sourcePath}`);
97
+ }
98
+ return resolvedPath;
99
+ };
100
+ const copyFileSource = (args) => {
101
+ const sourcePath = assertAllowedPath(args.input.path, args.allowedRoots);
102
+ const stat = fs_1.default.statSync(sourcePath);
103
+ if (!stat.isFile()) {
104
+ throw new errors_1.AgentVariantsError('SOURCE_CONTEXT_INVALID', `User context file path is not a regular file: ${args.input.path}`);
105
+ }
106
+ if (stat.size > MAX_FILE_CONTEXT_BYTES) {
107
+ throw new errors_1.AgentVariantsError('SOURCE_CONTEXT_TOO_LARGE', `User context file exceeds size limit (${stat.size} > ${MAX_FILE_CONTEXT_BYTES})`);
108
+ }
109
+ const originalFilename = path_1.default.basename(sourcePath);
110
+ const filename = `${args.id}-${safeNamePart(originalFilename, 'file')}`;
111
+ const destination = path_1.default.join(args.userDir, filename);
112
+ fs_1.default.copyFileSync(sourcePath, destination);
113
+ return {
114
+ source: {
115
+ id: args.id,
116
+ transport: 'file',
117
+ path: destination,
118
+ ...(args.input.mimeType ? { mimeType: args.input.mimeType } : {}),
119
+ originalFilename,
120
+ ...(args.input.label ? { label: args.input.label } : {}),
121
+ ...(args.input.userIntent ? { userIntent: args.input.userIntent } : {}),
122
+ },
123
+ storage: {
124
+ sizeBytes: stat.size,
125
+ sha256: sha256File(destination),
126
+ originalFilename,
127
+ },
128
+ };
129
+ };
130
+ const decodeUploadDataUrl = (dataUrl) => {
131
+ const match = dataUrl.match(UPLOAD_DATA_URL_PATTERN);
132
+ if (!match) {
133
+ throw new errors_1.AgentVariantsError('SOURCE_CONTEXT_INVALID', 'Uploaded user context must be a base64 data URL.');
134
+ }
135
+ const mimeType = match[1].toLowerCase().trim();
136
+ const extension = SUPPORTED_UPLOAD_IMAGE_EXTENSIONS.get(mimeType);
137
+ if (!extension) {
138
+ throw new errors_1.AgentVariantsError('SOURCE_CONTEXT_INVALID', `Unsupported uploaded user context MIME type: ${mimeType}`);
139
+ }
140
+ const base64Data = match[2].replace(/\s+/g, '');
141
+ if (!base64Data || !BASE64_PAYLOAD_PATTERN.test(base64Data)) {
142
+ throw new errors_1.AgentVariantsError('SOURCE_CONTEXT_INVALID', 'Uploaded user context contains invalid base64 data.');
143
+ }
144
+ const buffer = Buffer.from(base64Data, 'base64');
145
+ if (buffer.length === 0) {
146
+ throw new errors_1.AgentVariantsError('SOURCE_CONTEXT_INVALID', 'Uploaded user context is empty.');
147
+ }
148
+ if (buffer.length > MAX_FILE_CONTEXT_BYTES) {
149
+ throw new errors_1.AgentVariantsError('SOURCE_CONTEXT_TOO_LARGE', `Uploaded user context exceeds size limit (${buffer.length} > ${MAX_FILE_CONTEXT_BYTES})`);
150
+ }
151
+ return { buffer, mimeType, extension };
152
+ };
153
+ const copyUploadSource = (args) => {
154
+ const upload = decodeUploadDataUrl(args.input.dataUrl);
155
+ const originalFilename = args.input.filename;
156
+ const nameSource = originalFilename
157
+ ? path_1.default.parse(originalFilename).name
158
+ : args.input.label;
159
+ const filename = `${args.id}-${safeNamePart(nameSource, 'upload')}.${upload.extension}`;
160
+ const destination = path_1.default.join(args.userDir, filename);
161
+ ensureDir(path_1.default.dirname(destination));
162
+ fs_1.default.writeFileSync(destination, upload.buffer);
163
+ return {
164
+ source: {
165
+ id: args.id,
166
+ transport: 'file',
167
+ path: destination,
168
+ mimeType: upload.mimeType,
169
+ ...(originalFilename ? { originalFilename } : {}),
170
+ ...(args.input.label ? { label: args.input.label } : {}),
171
+ ...(args.input.userIntent ? { userIntent: args.input.userIntent } : {}),
172
+ },
173
+ storage: {
174
+ sizeBytes: upload.buffer.length,
175
+ sha256: sha256File(destination),
176
+ ...(originalFilename ? { originalFilename } : {}),
177
+ },
178
+ };
179
+ };
180
+ const createTextSource = (args) => {
181
+ const filename = `${args.id}-${safeNamePart(args.label, args.fallbackName)}.md`;
182
+ const textPath = path_1.default.join(args.userDir, filename);
183
+ writeTextFile(textPath, `${args.content.trim()}\n`);
184
+ return {
185
+ source: {
186
+ id: args.id,
187
+ transport: 'text',
188
+ path: textPath,
189
+ ...(args.label ? { label: args.label } : {}),
190
+ ...(args.userIntent ? { userIntent: args.userIntent } : {}),
191
+ },
192
+ storage: {
193
+ sizeBytes: Buffer.byteLength(args.content, 'utf8'),
194
+ sha256: sha256File(textPath),
195
+ },
196
+ };
197
+ };
198
+ /**
199
+ * Copies optional user-provided URL details onto the canonical source record.
200
+ */
201
+ const applyUrlSourceDetails = (record, details) => {
202
+ if (record.source.transport !== 'url')
203
+ return;
204
+ if (details.label && !record.source.label) {
205
+ record.source.label = details.label;
206
+ }
207
+ if (details.userIntent && !record.source.userIntent) {
208
+ record.source.userIntent = details.userIntent;
209
+ }
210
+ };
211
+ /**
212
+ * Creates the read-only user context bundle for a variants session.
213
+ */
214
+ const createVariantContextBundle = (args) => {
215
+ const contextBundlePath = path_1.default.join(args.workspaceRoot, '.rivet', 'variant-context', args.sessionId);
216
+ const userDir = path_1.default.join(contextBundlePath, USER_CONTEXT_DIRECTORY);
217
+ ensureDir(userDir);
218
+ ensureDir(path_1.default.join(contextBundlePath, METADATA_DIRECTORY));
219
+ const allowedRoots = resolveAllowedRoots([...(args.allowedRoots ?? [])]);
220
+ const storedUserContext = [];
221
+ const promptPath = path_1.default.join(userDir, PROMPT_FILE);
222
+ writeTextFile(promptPath, `${args.prompt.trim()}\n`);
223
+ storedUserContext.push({
224
+ source: {
225
+ id: 'uc_prompt_1',
226
+ transport: 'prompt',
227
+ path: promptPath,
228
+ },
229
+ storage: {
230
+ sizeBytes: Buffer.byteLength(args.prompt, 'utf8'),
231
+ sha256: sha256File(promptPath),
232
+ },
233
+ });
234
+ const urlRecordsByUrl = new Map();
235
+ const addUrlSource = (args) => {
236
+ const normalized = (0, sourceContext_1.normalizeUrl)(args.url);
237
+ if (!normalized) {
238
+ if (args.isRequired) {
239
+ throw new errors_1.AgentVariantsError('SOURCE_CONTEXT_INVALID', `Invalid user context URL: ${args.url}`);
240
+ }
241
+ return false;
242
+ }
243
+ const existingRecord = urlRecordsByUrl.get(normalized);
244
+ if (existingRecord) {
245
+ applyUrlSourceDetails(existingRecord, {
246
+ label: args.label,
247
+ userIntent: args.userIntent,
248
+ });
249
+ return true;
250
+ }
251
+ const record = {
252
+ source: {
253
+ id: args.id,
254
+ transport: 'url',
255
+ url: normalized,
256
+ ...(args.label ? { label: args.label } : {}),
257
+ ...(args.userIntent ? { userIntent: args.userIntent } : {}),
258
+ },
259
+ };
260
+ urlRecordsByUrl.set(normalized, record);
261
+ storedUserContext.push(record);
262
+ return true;
263
+ };
264
+ let urlIndex = 0;
265
+ for (const url of args.sourceUrls ?? []) {
266
+ const isUrlSourceAccepted = addUrlSource({
267
+ id: `uc_url_${urlIndex + 1}`,
268
+ url,
269
+ });
270
+ if (isUrlSourceAccepted) {
271
+ urlIndex += 1;
272
+ }
273
+ }
274
+ let extraIndex = 0;
275
+ for (const input of args.userContextInputs ?? []) {
276
+ extraIndex += 1;
277
+ if (input.transport === 'url') {
278
+ addUrlSource({
279
+ id: `uc_input_${extraIndex}`,
280
+ url: input.url,
281
+ label: input.label,
282
+ userIntent: input.userIntent,
283
+ isRequired: true,
284
+ });
285
+ }
286
+ else if (input.transport === 'text') {
287
+ storedUserContext.push(createTextSource({
288
+ id: `uc_input_${extraIndex}`,
289
+ userDir,
290
+ label: input.label,
291
+ userIntent: input.userIntent,
292
+ content: input.content,
293
+ fallbackName: `input-${extraIndex}`,
294
+ }));
295
+ }
296
+ else if (input.transport === 'file_path') {
297
+ storedUserContext.push(copyFileSource({
298
+ input,
299
+ id: `uc_input_${extraIndex}`,
300
+ userDir,
301
+ allowedRoots,
302
+ }));
303
+ }
304
+ else if (input.transport === 'upload') {
305
+ storedUserContext.push(copyUploadSource({
306
+ input,
307
+ id: `uc_input_${extraIndex}`,
308
+ userDir,
309
+ }));
310
+ }
311
+ else {
312
+ const sourcePath = assertAllowedPath(input.path, allowedRoots);
313
+ if (!fs_1.default.statSync(sourcePath).isDirectory()) {
314
+ throw new errors_1.AgentVariantsError('SOURCE_CONTEXT_INVALID', `User context directory path is not a directory: ${input.path}`);
315
+ }
316
+ storedUserContext.push({
317
+ source: {
318
+ id: `uc_input_${extraIndex}`,
319
+ transport: 'directory',
320
+ path: sourcePath,
321
+ ...(input.label ? { label: input.label } : {}),
322
+ ...(input.userIntent ? { userIntent: input.userIntent } : {}),
323
+ },
324
+ });
325
+ }
326
+ }
327
+ const bundle = {
328
+ version: 1,
329
+ sessionId: args.sessionId,
330
+ contextBundlePath,
331
+ userContext: storedUserContext.map((entry) => entry.source),
332
+ rivetActions: [],
333
+ rivetMetadata: [],
334
+ };
335
+ (0, exports.writeVariantContextBundle)(bundle, storedUserContext);
336
+ return bundle;
337
+ };
338
+ exports.createVariantContextBundle = createVariantContextBundle;
339
+ /**
340
+ * Persists the durable context bundle manifest after planning metadata changes.
341
+ */
342
+ const writeVariantContextBundle = (bundle, storedUserContext) => {
343
+ ensureDir(bundle.contextBundlePath);
344
+ const manifest = {
345
+ ...bundle,
346
+ storedUserContext: storedUserContext ??
347
+ readStoredUserContext(bundle.contextBundlePath) ??
348
+ bundle.userContext.map((source) => ({
349
+ source,
350
+ })),
351
+ };
352
+ fs_1.default.writeFileSync(path_1.default.join(bundle.contextBundlePath, CONTEXT_FILE), `${JSON.stringify(manifest, null, 2)}\n`, 'utf8');
353
+ };
354
+ exports.writeVariantContextBundle = writeVariantContextBundle;
355
+ //# sourceMappingURL=variantContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variantContext.js","sourceRoot":"","sources":["../../../src/mcp/agent-variants/variantContext.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ import type { Response } from 'express';
2
+ import type { OAuthServerProvider, AuthorizationParams } from '@modelcontextprotocol/sdk/server/auth/provider.js';
3
+ import type { OAuthRegisteredClientsStore } from '@modelcontextprotocol/sdk/server/auth/clients.js';
4
+ import type { OAuthClientInformationFull, OAuthTokens } from '@modelcontextprotocol/sdk/shared/auth.js';
5
+ import type { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js';
6
+ /** Rivet credentials issued by the proxy after a completed browser login. */
7
+ export type PersistedRivetTokens = {
8
+ token: string;
9
+ refreshToken?: string;
10
+ user?: {
11
+ id: string;
12
+ email: string;
13
+ };
14
+ };
15
+ export type RivetOAuthProviderOptions = {
16
+ /** Base URL of the Rivet proxy (auth backend), e.g. https://rivet-proxy.onrender.com */
17
+ proxyUrl: string;
18
+ /**
19
+ * Public URL of the local OAuth browser callback page. Must be a bare
20
+ * localhost origin (no path) — the proxy rejects custom redirect paths.
21
+ */
22
+ callbackUrl: string;
23
+ /** The MCP client (`--editor`), recorded with the login for analytics. */
24
+ mcpEditor?: string;
25
+ /** Persists tokens locally after login (e.g. ConfigManager.setAuth). */
26
+ persistTokens?: (tokens: PersistedRivetTokens) => void;
27
+ /** Confirms a refresh token is still accepted by durable local auth state. */
28
+ isRefreshTokenCurrent?: (refreshToken: string) => boolean;
29
+ fetchImpl?: typeof fetch;
30
+ /** Test override for the proxy token polling interval. */
31
+ pollIntervalMs?: number;
32
+ };
33
+ /** In-memory dynamic client registration store (clients are ephemeral). */
34
+ declare class InMemoryClientsStore implements OAuthRegisteredClientsStore {
35
+ private clients;
36
+ getClient(clientId: string): OAuthClientInformationFull | undefined;
37
+ registerClient(client: Omit<OAuthClientInformationFull, 'client_id' | 'client_id_issued_at'> & Partial<Pick<OAuthClientInformationFull, 'client_id' | 'client_id_issued_at'>>): OAuthClientInformationFull;
38
+ }
39
+ /**
40
+ * OAuth authorization server provider that bridges the MCP OAuth spec
41
+ * (authorization code + PKCE, dynamic client registration) onto the existing
42
+ * Rivet proxy Google login flow:
43
+ *
44
+ * 1. `authorize` starts a proxy Google login with this server's local
45
+ * callback page as the redirect origin and sends the browser to Google.
46
+ * 2. The browser returns to the local callback page, which forwards the
47
+ * Supabase hash tokens to `completeBrowserCallback`. That completes the
48
+ * proxy login, obtains the Rivet access token, and mints a single-use
49
+ * authorization code bound to the client's PKCE challenge.
50
+ * 3. `exchangeAuthorizationCode` returns the Rivet access token as the OAuth
51
+ * access token; `verifyAccessToken` validates bearer tokens against the
52
+ * proxy profile endpoint.
53
+ */
54
+ export declare class RivetOAuthServerProvider implements OAuthServerProvider {
55
+ readonly clientsStore: InMemoryClientsStore;
56
+ private readonly proxyUrl;
57
+ private readonly callbackUrl;
58
+ private readonly mcpEditor?;
59
+ private readonly persistTokens?;
60
+ private readonly isRefreshTokenCurrent?;
61
+ private readonly fetchFn;
62
+ private readonly pollIntervalMs;
63
+ private readonly pendingAuthorizations;
64
+ private readonly authorizationCodes;
65
+ private readonly issuedBearerTokens;
66
+ private readonly verifiedTokens;
67
+ private readonly revokedAccessTokens;
68
+ private readonly revokedRefreshTokens;
69
+ private readonly activeRefreshTokens;
70
+ constructor(options: RivetOAuthProviderOptions);
71
+ authorize(client: OAuthClientInformationFull, params: AuthorizationParams, res: Response): Promise<void>;
72
+ /**
73
+ * Completes a browser login forwarded by the local OAuth callback page:
74
+ * finishes the proxy login session, obtains Rivet credentials, mints a
75
+ * single-use authorization code, and returns the MCP client redirect URL.
76
+ */
77
+ completeBrowserCallback(input: {
78
+ sessionId?: string;
79
+ accessToken?: string;
80
+ refreshToken?: string;
81
+ }): Promise<{
82
+ redirectUrl: string;
83
+ }>;
84
+ challengeForAuthorizationCode(client: OAuthClientInformationFull, authorizationCode: string): Promise<string>;
85
+ exchangeAuthorizationCode(client: OAuthClientInformationFull, authorizationCode: string, _codeVerifier?: string, redirectUri?: string): Promise<OAuthTokens>;
86
+ exchangeRefreshToken(_client: OAuthClientInformationFull, refreshToken: string): Promise<OAuthTokens>;
87
+ verifyAccessToken(token: string): Promise<AuthInfo>;
88
+ /**
89
+ * Invalidates a bearer token issued by this OAuth provider and its paired
90
+ * refresh token, if the provider knows one.
91
+ */
92
+ revokeAccessToken(token: string): void;
93
+ private rememberIssuedBearerToken;
94
+ private getValidCodeEntry;
95
+ private toOAuthTokens;
96
+ private pollForRivetTokens;
97
+ private prunePendingAuthorizations;
98
+ private pruneAuthorizationCodes;
99
+ private pruneVerifiedTokens;
100
+ private pruneIssuedBearerTokens;
101
+ }
102
+ export {};
103
+ //# sourceMappingURL=httpOAuthProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpOAuthProvider.d.ts","sourceRoot":"","sources":["../../../src/mcp/auth/httpOAuthProvider.ts"],"names":[],"mappings":"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"}