rivet-design 0.9.10 → 0.10.1
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/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +249 -3
- package/dist/index.js.map +1 -1
- package/dist/mcp/agent-variants/WorktreeOrchestrator.d.ts +5 -0
- package/dist/mcp/agent-variants/WorktreeOrchestrator.d.ts.map +1 -1
- package/dist/mcp/agent-variants/WorktreeOrchestrator.js +7 -0
- package/dist/mcp/agent-variants/WorktreeOrchestrator.js.map +1 -1
- package/dist/mcp/server.d.ts +19 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +67 -102
- 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/proxy-middleware/preview-bridge.d.ts +24 -0
- package/dist/proxy-middleware/preview-bridge.d.ts.map +1 -0
- package/dist/proxy-middleware/preview-bridge.js +358 -0
- package/dist/proxy-middleware/preview-bridge.js.map +1 -0
- package/dist/proxy-middleware/proxy-config.d.ts +5 -1
- package/dist/proxy-middleware/proxy-config.d.ts.map +1 -1
- package/dist/proxy-middleware/proxy-config.js +62 -18
- package/dist/proxy-middleware/proxy-config.js.map +1 -1
- 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/mcp.d.ts +3 -1
- package/dist/routes/mcp.d.ts.map +1 -1
- package/dist/routes/mcp.js +33 -3
- package/dist/routes/mcp.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/routes/static.d.ts +6 -1
- package/dist/routes/static.d.ts.map +1 -1
- package/dist/routes/static.js +15 -3
- package/dist/routes/static.js.map +1 -1
- package/dist/server.d.ts +48 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +228 -33
- package/dist/server.js.map +1 -1
- package/dist/services/AgentSessionService.d.ts +87 -0
- package/dist/services/AgentSessionService.d.ts.map +1 -0
- package/dist/services/AgentSessionService.js +275 -0
- package/dist/services/AgentSessionService.js.map +1 -0
- 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 +7 -0
- package/dist/services/ConfigManager.d.ts.map +1 -1
- package/dist/services/ConfigManager.js +13 -0
- package/dist/services/ConfigManager.js.map +1 -1
- package/dist/services/HostedDemoAuthSessionService.d.ts +6 -0
- package/dist/services/HostedDemoAuthSessionService.d.ts.map +1 -1
- package/dist/services/HostedDemoAuthSessionService.js +13 -0
- package/dist/services/HostedDemoAuthSessionService.js.map +1 -1
- package/dist/services/InlineVariantGenerationService.d.ts +50 -0
- package/dist/services/InlineVariantGenerationService.d.ts.map +1 -0
- package/dist/services/InlineVariantGenerationService.js +394 -0
- package/dist/services/InlineVariantGenerationService.js.map +1 -0
- 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/SessionBridgeService.d.ts +3 -3
- package/dist/services/SessionBridgeService.d.ts.map +1 -1
- package/dist/services/SessionBridgeService.js +15 -3
- package/dist/services/SessionBridgeService.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/TerminalAgentRunner.d.ts +65 -0
- package/dist/services/TerminalAgentRunner.d.ts.map +1 -0
- package/dist/services/TerminalAgentRunner.js +511 -0
- package/dist/services/TerminalAgentRunner.js.map +1 -0
- package/dist/services/VariantHistoryService.d.ts +23 -0
- package/dist/services/VariantHistoryService.d.ts.map +1 -1
- package/dist/services/VariantHistoryService.js +22 -0
- package/dist/services/VariantHistoryService.js.map +1 -1
- package/dist/services/WorktreeManager.d.ts +5 -4
- package/dist/services/WorktreeManager.d.ts.map +1 -1
- package/dist/services/WorktreeManager.js +22 -12
- package/dist/services/WorktreeManager.js.map +1 -1
- package/dist/services/accessTokenRefresh.d.ts +8 -0
- package/dist/services/accessTokenRefresh.d.ts.map +1 -1
- package/dist/services/accessTokenRefresh.js +30 -1
- package/dist/services/accessTokenRefresh.js.map +1 -1
- package/dist/services/createAgentVariantsOrchestrator.d.ts +16 -0
- package/dist/services/createAgentVariantsOrchestrator.d.ts.map +1 -0
- package/dist/services/createAgentVariantsOrchestrator.js +42 -0
- package/dist/services/createAgentVariantsOrchestrator.js.map +1 -0
- package/dist/types/change-request-types.d.ts +12 -0
- package/dist/types/change-request-types.d.ts.map +1 -1
- package/dist/utils/elementFileHintSignals.d.ts +8 -0
- package/dist/utils/elementFileHintSignals.d.ts.map +1 -0
- package/dist/utils/elementFileHintSignals.js +40 -0
- package/dist/utils/elementFileHintSignals.js.map +1 -0
- package/dist/utils/formatElementTargetingContext.d.ts +34 -0
- package/dist/utils/formatElementTargetingContext.d.ts.map +1 -0
- package/dist/utils/formatElementTargetingContext.js +88 -0
- package/dist/utils/formatElementTargetingContext.js.map +1 -0
- package/dist/utils/queueAccess.d.ts +11 -0
- package/dist/utils/queueAccess.d.ts.map +1 -0
- package/dist/utils/queueAccess.js +15 -0
- package/dist/utils/queueAccess.js.map +1 -0
- package/package.json +3 -2
- package/src/ui/dist/assets/main-CJ9ZAQrU.css +1 -0
- package/src/ui/dist/assets/main-D-FdZGgx.js +640 -0
- package/src/ui/dist/index.html +2 -2
- package/src/ui/dist/assets/main-BZEruoyc.css +0 -1
- package/src/ui/dist/assets/main-ChnGmvJG.js +0 -382
|
@@ -0,0 +1,394 @@
|
|
|
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.InlineVariantGenerationService = void 0;
|
|
7
|
+
const crypto_1 = require("crypto");
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const index_core_1 = require("../index-core");
|
|
10
|
+
const changeBatchClassification_1 = require("../mcp/changeBatchClassification");
|
|
11
|
+
const log = (0, index_core_1.createLogger)('InlineVariantGenerationService');
|
|
12
|
+
const INLINE_VARIANT_LEASE_HEARTBEAT_MS = 60_000;
|
|
13
|
+
const INLINE_VARIANT_BRIEF_DIRECTIONS = [
|
|
14
|
+
{
|
|
15
|
+
label: 'Refined Focus',
|
|
16
|
+
body: 'Subtle polish with tighter hierarchy and calmer emphasis.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
label: 'Bold Contrast',
|
|
20
|
+
body: 'Stronger contrast with clearer visual weight and presence.',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
label: 'Airy Layout',
|
|
24
|
+
body: 'More breathing room with lighter spacing and softer rhythm.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
label: 'Editorial Polish',
|
|
28
|
+
body: 'Magazine-like composition with crisp details and confident tone.',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
label: 'Playful Accent',
|
|
32
|
+
body: 'Expressive accents with lively color and approachable energy.',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
label: 'Calm Minimal',
|
|
36
|
+
body: 'Reduced ornament with quiet structure and restrained styling.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
label: 'Dense Utility',
|
|
40
|
+
body: 'Compact information density with practical controls and clarity.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
label: 'Sharp Detail',
|
|
44
|
+
body: 'Precise edges with stronger alignment and cleaner finishing.',
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
const hasWhitespace = (value) => /\s/.test(value);
|
|
48
|
+
const deriveTarget = (element) => {
|
|
49
|
+
const filePaths = element.filePaths ?? [];
|
|
50
|
+
if (filePaths.length === 1) {
|
|
51
|
+
return { type: 'file', ref: filePaths[0] };
|
|
52
|
+
}
|
|
53
|
+
if (element.rivetId) {
|
|
54
|
+
return {
|
|
55
|
+
type: 'element',
|
|
56
|
+
ref: `[data-rivet-id="${element.rivetId}"]`,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
if (element.id && !hasWhitespace(element.id)) {
|
|
60
|
+
return { type: 'element', ref: `#${element.id}` };
|
|
61
|
+
}
|
|
62
|
+
if (element.xpath) {
|
|
63
|
+
return { type: 'element', ref: element.xpath };
|
|
64
|
+
}
|
|
65
|
+
const classTokens = element.className.trim().split(/\s+/).filter(Boolean);
|
|
66
|
+
if (classTokens.length === 1) {
|
|
67
|
+
return { type: 'element', ref: `.${classTokens[0]}` };
|
|
68
|
+
}
|
|
69
|
+
return { type: 'element', ref: element.tagName.toLowerCase() };
|
|
70
|
+
};
|
|
71
|
+
const getWorktreePath = (workItem) => {
|
|
72
|
+
if (!workItem.input || typeof workItem.input !== 'object') {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
const worktreePath = workItem.input
|
|
76
|
+
.worktreePath;
|
|
77
|
+
return typeof worktreePath === 'string' && worktreePath.trim()
|
|
78
|
+
? worktreePath
|
|
79
|
+
: null;
|
|
80
|
+
};
|
|
81
|
+
const getBrief = (workItem) => {
|
|
82
|
+
const input = workItem.input && typeof workItem.input === 'object'
|
|
83
|
+
? workItem.input
|
|
84
|
+
: {};
|
|
85
|
+
return {
|
|
86
|
+
label: typeof input.briefLabel === 'string' && input.briefLabel.trim()
|
|
87
|
+
? input.briefLabel
|
|
88
|
+
: 'Variant',
|
|
89
|
+
body: typeof input.briefBody === 'string' && input.briefBody.trim()
|
|
90
|
+
? input.briefBody
|
|
91
|
+
: 'Create a distinct inline variation.',
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
const isInsidePath = (rootPath, candidatePath) => {
|
|
95
|
+
const relativePath = path_1.default.relative(rootPath, candidatePath);
|
|
96
|
+
return (relativePath === '' ||
|
|
97
|
+
(!relativePath.startsWith('..') && !path_1.default.isAbsolute(relativePath)));
|
|
98
|
+
};
|
|
99
|
+
const rebaseFilePath = (args) => {
|
|
100
|
+
const trimmedPath = args.filePath.trim();
|
|
101
|
+
if (!trimmedPath) {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
if (!path_1.default.isAbsolute(trimmedPath)) {
|
|
105
|
+
const worktreeRelativePath = path_1.default.resolve(args.worktreeProjectPath, trimmedPath);
|
|
106
|
+
return isInsidePath(args.worktreeProjectPath, worktreeRelativePath)
|
|
107
|
+
? worktreeRelativePath
|
|
108
|
+
: null;
|
|
109
|
+
}
|
|
110
|
+
if (isInsidePath(args.worktreePath, trimmedPath)) {
|
|
111
|
+
return trimmedPath;
|
|
112
|
+
}
|
|
113
|
+
if (args.baseProjectPath && isInsidePath(args.baseProjectPath, trimmedPath)) {
|
|
114
|
+
return path_1.default.join(args.worktreeProjectPath, path_1.default.relative(args.baseProjectPath, trimmedPath));
|
|
115
|
+
}
|
|
116
|
+
return null;
|
|
117
|
+
};
|
|
118
|
+
const rebaseFilePaths = (args) => Array.from(new Set(args.filePaths
|
|
119
|
+
.map((filePath) => rebaseFilePath({
|
|
120
|
+
filePath,
|
|
121
|
+
baseProjectPath: args.baseProjectPath,
|
|
122
|
+
worktreePath: args.worktreePath,
|
|
123
|
+
worktreeProjectPath: args.worktreeProjectPath,
|
|
124
|
+
}))
|
|
125
|
+
.filter((filePath) => Boolean(filePath))));
|
|
126
|
+
const rebaseElementFilePaths = (args) => ({
|
|
127
|
+
...args.element,
|
|
128
|
+
filePaths: rebaseFilePaths({
|
|
129
|
+
filePaths: args.element.filePaths,
|
|
130
|
+
baseProjectPath: args.baseProjectPath,
|
|
131
|
+
worktreePath: args.worktreePath,
|
|
132
|
+
worktreeProjectPath: args.worktreeProjectPath,
|
|
133
|
+
}),
|
|
134
|
+
});
|
|
135
|
+
const buildInlineVariantBriefs = (count) => INLINE_VARIANT_BRIEF_DIRECTIONS.slice(0, count).map((brief) => ({
|
|
136
|
+
...brief,
|
|
137
|
+
}));
|
|
138
|
+
const buildVariantChangeRequest = (args) => {
|
|
139
|
+
const brief = getBrief(args.workItem);
|
|
140
|
+
const instruction = [
|
|
141
|
+
`Create inline variant "${brief.label}".`,
|
|
142
|
+
`Variant direction: ${brief.body}`,
|
|
143
|
+
`Original request: ${args.comment.instruction}`,
|
|
144
|
+
'Apply the change only in this variant worktree. Keep the edit scoped to the selected/commented element context.',
|
|
145
|
+
].join('\n');
|
|
146
|
+
return {
|
|
147
|
+
...args.baseRequest,
|
|
148
|
+
worktreePath: args.worktreePath,
|
|
149
|
+
sourceFiles: rebaseFilePaths({
|
|
150
|
+
filePaths: args.baseRequest.sourceFiles,
|
|
151
|
+
baseProjectPath: args.baseProjectPath,
|
|
152
|
+
worktreePath: args.worktreePath,
|
|
153
|
+
worktreeProjectPath: args.worktreeProjectPath,
|
|
154
|
+
}),
|
|
155
|
+
changes: [
|
|
156
|
+
{
|
|
157
|
+
...args.comment,
|
|
158
|
+
element: rebaseElementFilePaths({
|
|
159
|
+
element: args.comment.element,
|
|
160
|
+
baseProjectPath: args.baseProjectPath,
|
|
161
|
+
worktreePath: args.worktreePath,
|
|
162
|
+
worktreeProjectPath: args.worktreeProjectPath,
|
|
163
|
+
}),
|
|
164
|
+
elements: args.comment.elements?.map((element) => rebaseElementFilePaths({
|
|
165
|
+
element,
|
|
166
|
+
baseProjectPath: args.baseProjectPath,
|
|
167
|
+
worktreePath: args.worktreePath,
|
|
168
|
+
worktreeProjectPath: args.worktreeProjectPath,
|
|
169
|
+
})),
|
|
170
|
+
instruction,
|
|
171
|
+
variantRequest: undefined,
|
|
172
|
+
},
|
|
173
|
+
],
|
|
174
|
+
};
|
|
175
|
+
};
|
|
176
|
+
/**
|
|
177
|
+
* Runs selected-element variant requests through the server-owned variants lifecycle.
|
|
178
|
+
*/
|
|
179
|
+
class InlineVariantGenerationService {
|
|
180
|
+
bridge;
|
|
181
|
+
orchestrator;
|
|
182
|
+
runner;
|
|
183
|
+
createSessionId;
|
|
184
|
+
leaseHeartbeatMs;
|
|
185
|
+
constructor(options) {
|
|
186
|
+
this.bridge = options.bridge;
|
|
187
|
+
this.orchestrator = options.orchestrator;
|
|
188
|
+
this.runner = options.runner;
|
|
189
|
+
this.createSessionId = options.createSessionId ?? crypto_1.randomUUID;
|
|
190
|
+
this.leaseHeartbeatMs =
|
|
191
|
+
options.leaseHeartbeatMs ?? INLINE_VARIANT_LEASE_HEARTBEAT_MS;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* @effect Starts an inline variants session, runs each leased worktree with an isolated terminal agent, and reports each result.
|
|
195
|
+
*/
|
|
196
|
+
async processVariantRequest(request) {
|
|
197
|
+
if (!(0, changeBatchClassification_1.isSingleVariantRequestBatch)(request)) {
|
|
198
|
+
this.bridge.reportFeedback('Inline variants require one variant comment.');
|
|
199
|
+
this.bridge.setStatus('READY');
|
|
200
|
+
return { success: false, error: 'Invalid inline variant request' };
|
|
201
|
+
}
|
|
202
|
+
const comment = request.changes[0];
|
|
203
|
+
const count = comment.variantRequest?.count;
|
|
204
|
+
if (typeof count !== 'number') {
|
|
205
|
+
this.bridge.reportFeedback('Inline variant request is missing a count.');
|
|
206
|
+
this.bridge.setStatus('READY');
|
|
207
|
+
return { success: false, error: 'Missing variant count' };
|
|
208
|
+
}
|
|
209
|
+
const agentLabel = this.runner.getDisplayName?.() ?? 'Claude Code';
|
|
210
|
+
this.bridge.setStatus('APPLYING');
|
|
211
|
+
this.bridge.reportFeedback(`Starting ${count} inline variants.`);
|
|
212
|
+
try {
|
|
213
|
+
const startResult = await this.orchestrator.startUnified({
|
|
214
|
+
prompt: comment.instruction,
|
|
215
|
+
target: deriveTarget(comment.element),
|
|
216
|
+
projectContext: { kind: 'existing' },
|
|
217
|
+
leaseOwner: `rivet-agent-${agentLabel.toLowerCase().replace(/\s+/g, '-')}`,
|
|
218
|
+
briefs: buildInlineVariantBriefs(count),
|
|
219
|
+
});
|
|
220
|
+
const leasedItems = startResult.leasedWorkItems ?? [];
|
|
221
|
+
this.bridge.reportFeedback(`Creating ${leasedItems.length} worktrees.`);
|
|
222
|
+
if (leasedItems.length === 0) {
|
|
223
|
+
const error = 'No inline variant work items were leased';
|
|
224
|
+
this.bridge.reportFeedback(`${error}.`);
|
|
225
|
+
await this.orchestrator
|
|
226
|
+
.cancel({
|
|
227
|
+
sessionId: startResult.sessionId,
|
|
228
|
+
reason: error,
|
|
229
|
+
})
|
|
230
|
+
.catch((cancelError) => {
|
|
231
|
+
log.warn('Inline variant session cancellation failed', cancelError);
|
|
232
|
+
});
|
|
233
|
+
this.bridge.setStatus('READY');
|
|
234
|
+
return { success: false, error };
|
|
235
|
+
}
|
|
236
|
+
const results = await Promise.all(leasedItems.map((workItem, index) => this.runLeasedVariantSafely({
|
|
237
|
+
request,
|
|
238
|
+
comment,
|
|
239
|
+
workItem,
|
|
240
|
+
leaseId: startResult.leaseId ?? '',
|
|
241
|
+
sessionId: startResult.sessionId,
|
|
242
|
+
index,
|
|
243
|
+
})));
|
|
244
|
+
const isSuccess = results.every((result) => result.success);
|
|
245
|
+
this.bridge.reportFeedback(isSuccess
|
|
246
|
+
? `${agentLabel} finished generating inline variants.`
|
|
247
|
+
: `${agentLabel} finished with one or more variant failures.`);
|
|
248
|
+
this.bridge.reportFeedback('__RIVET_REFRESH_GIT__');
|
|
249
|
+
this.bridge.setStatus('READY');
|
|
250
|
+
return isSuccess
|
|
251
|
+
? { success: true }
|
|
252
|
+
: {
|
|
253
|
+
success: false,
|
|
254
|
+
error: results.find((result) => !result.success)?.error ??
|
|
255
|
+
'Inline variant generation failed',
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
260
|
+
log.error('Inline variant generation failed', error);
|
|
261
|
+
this.bridge.reportFeedback(`${agentLabel} failed variants: ${message}`);
|
|
262
|
+
this.bridge.reportFeedback('__RIVET_REFRESH_GIT__');
|
|
263
|
+
this.bridge.setStatus('READY');
|
|
264
|
+
return { success: false, error: message };
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* @effect Converts per-variant setup/reporting failures into failed results after sibling runs settle.
|
|
269
|
+
*/
|
|
270
|
+
async runLeasedVariantSafely(args) {
|
|
271
|
+
try {
|
|
272
|
+
return await this.runLeasedVariant(args);
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
276
|
+
const brief = getBrief(args.workItem);
|
|
277
|
+
log.error(`Inline variant ${brief.label} failed`, error);
|
|
278
|
+
this.bridge.reportFeedback(`Variant ${brief.label} failed: ${message}`);
|
|
279
|
+
await this.orchestrator
|
|
280
|
+
.reportComplete({
|
|
281
|
+
sessionId: args.sessionId,
|
|
282
|
+
workItemId: args.workItem.id,
|
|
283
|
+
leaseId: args.leaseId,
|
|
284
|
+
attempt: args.workItem.attempt,
|
|
285
|
+
status: 'failed',
|
|
286
|
+
error: { code: 'VARIANT_RUN_FAILED', message },
|
|
287
|
+
})
|
|
288
|
+
.catch((reportError) => {
|
|
289
|
+
log.warn('Inline variant failure report failed', reportError);
|
|
290
|
+
});
|
|
291
|
+
return { success: false, error: message };
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* @effect Runs one leased code-generation item and reports its terminal status to the variants orchestrator.
|
|
296
|
+
*/
|
|
297
|
+
async runLeasedVariant(args) {
|
|
298
|
+
const worktreePath = getWorktreePath(args.workItem);
|
|
299
|
+
const brief = getBrief(args.workItem);
|
|
300
|
+
if (!worktreePath) {
|
|
301
|
+
const error = `Variant ${brief.label} has no worktree path.`;
|
|
302
|
+
await this.orchestrator.reportComplete({
|
|
303
|
+
sessionId: args.sessionId,
|
|
304
|
+
workItemId: args.workItem.id,
|
|
305
|
+
leaseId: args.leaseId,
|
|
306
|
+
attempt: args.workItem.attempt,
|
|
307
|
+
status: 'failed',
|
|
308
|
+
error: { code: 'MISSING_WORKTREE', message: error },
|
|
309
|
+
});
|
|
310
|
+
this.bridge.reportFeedback(error);
|
|
311
|
+
return { success: false, error };
|
|
312
|
+
}
|
|
313
|
+
const agentLabel = this.runner.getDisplayName?.() ?? 'Claude Code';
|
|
314
|
+
const terminalSessionId = this.createSessionId();
|
|
315
|
+
const worktreeProjectPath = await this.orchestrator.getProjectCwdInWorktree(worktreePath);
|
|
316
|
+
this.bridge.reportFeedback(`Running ${agentLabel} for variant ${args.index + 1}: ${brief.label}.`);
|
|
317
|
+
await this.orchestrator.reportComplete({
|
|
318
|
+
sessionId: args.sessionId,
|
|
319
|
+
workItemId: args.workItem.id,
|
|
320
|
+
leaseId: args.leaseId,
|
|
321
|
+
attempt: args.workItem.attempt,
|
|
322
|
+
status: 'running',
|
|
323
|
+
});
|
|
324
|
+
const stopHeartbeat = this.startLeaseHeartbeat({
|
|
325
|
+
sessionId: args.sessionId,
|
|
326
|
+
workItem: args.workItem,
|
|
327
|
+
leaseId: args.leaseId,
|
|
328
|
+
});
|
|
329
|
+
let result;
|
|
330
|
+
try {
|
|
331
|
+
result = await this.runner.runChangeRequest({
|
|
332
|
+
request: buildVariantChangeRequest({
|
|
333
|
+
baseRequest: args.request,
|
|
334
|
+
comment: args.comment,
|
|
335
|
+
workItem: args.workItem,
|
|
336
|
+
worktreePath,
|
|
337
|
+
worktreeProjectPath,
|
|
338
|
+
baseProjectPath: this.bridge.getProjectPath(),
|
|
339
|
+
}),
|
|
340
|
+
cwd: worktreeProjectPath,
|
|
341
|
+
sessionId: terminalSessionId,
|
|
342
|
+
resumeSession: false,
|
|
343
|
+
onFeedback: (message) => this.bridge.reportFeedback(`${brief.label}: ${message}`),
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
finally {
|
|
347
|
+
stopHeartbeat();
|
|
348
|
+
}
|
|
349
|
+
if (!result.success) {
|
|
350
|
+
const error = result.error ?? 'unknown error';
|
|
351
|
+
await this.orchestrator.reportComplete({
|
|
352
|
+
sessionId: args.sessionId,
|
|
353
|
+
workItemId: args.workItem.id,
|
|
354
|
+
leaseId: args.leaseId,
|
|
355
|
+
attempt: args.workItem.attempt,
|
|
356
|
+
status: 'failed',
|
|
357
|
+
error: { code: 'AGENT_FAILED', message: error },
|
|
358
|
+
});
|
|
359
|
+
this.bridge.reportFeedback(`${agentLabel} failed variant ${brief.label}: ${error}`);
|
|
360
|
+
return { success: false, error };
|
|
361
|
+
}
|
|
362
|
+
await this.orchestrator.reportComplete({
|
|
363
|
+
sessionId: args.sessionId,
|
|
364
|
+
workItemId: args.workItem.id,
|
|
365
|
+
leaseId: args.leaseId,
|
|
366
|
+
attempt: args.workItem.attempt,
|
|
367
|
+
status: 'succeeded',
|
|
368
|
+
output: { worktreePath, changedFiles: [] },
|
|
369
|
+
});
|
|
370
|
+
this.bridge.reportFeedback(`${agentLabel} completed variant ${brief.label}.`);
|
|
371
|
+
return { success: true };
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* @effect Periodically reports a running status so long terminal agent runs keep their variant lease.
|
|
375
|
+
*/
|
|
376
|
+
startLeaseHeartbeat(args) {
|
|
377
|
+
const interval = setInterval(() => {
|
|
378
|
+
void this.orchestrator
|
|
379
|
+
.reportComplete({
|
|
380
|
+
sessionId: args.sessionId,
|
|
381
|
+
workItemId: args.workItem.id,
|
|
382
|
+
leaseId: args.leaseId,
|
|
383
|
+
attempt: args.workItem.attempt,
|
|
384
|
+
status: 'running',
|
|
385
|
+
})
|
|
386
|
+
.catch((error) => {
|
|
387
|
+
log.warn('Inline variant lease heartbeat failed', error);
|
|
388
|
+
});
|
|
389
|
+
}, this.leaseHeartbeatMs);
|
|
390
|
+
return () => clearInterval(interval);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
exports.InlineVariantGenerationService = InlineVariantGenerationService;
|
|
394
|
+
//# sourceMappingURL=InlineVariantGenerationService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InlineVariantGenerationService.js","sourceRoot":"","sources":["../../src/services/InlineVariantGenerationService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { BundleFile } from './BundleStore';
|
|
2
|
+
export declare class PrototypeBuildError extends Error {
|
|
3
|
+
/** Tail of the failing step's stderr, for surfacing in the UI toast. */
|
|
4
|
+
readonly detail?: string | undefined;
|
|
5
|
+
constructor(message: string,
|
|
6
|
+
/** Tail of the failing step's stderr, for surfacing in the UI toast. */
|
|
7
|
+
detail?: string | undefined);
|
|
8
|
+
}
|
|
9
|
+
export interface BuildResult {
|
|
10
|
+
files: BundleFile[];
|
|
11
|
+
/** Total decoded byte size of the bundle (pre-base64). */
|
|
12
|
+
totalBytes: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Builds a fresh-project (Vite) variant into a static bundle ready to upload to
|
|
16
|
+
* the Prototype Preview Host.
|
|
17
|
+
*
|
|
18
|
+
* The variant snapshot under `.rivet/variants/.../files/` is treated as
|
|
19
|
+
* immutable, so we copy it to an OS temp scratch dir and build there. We run
|
|
20
|
+
* `vite build --base=./` directly (not `npm run build`) so a `tsc` type error
|
|
21
|
+
* in agent-generated code doesn't block a purely visual deploy, and so asset
|
|
22
|
+
* URLs are relative (the host serves under `/p/<deployId>/` and injects a
|
|
23
|
+
* matching `<base href>`).
|
|
24
|
+
*/
|
|
25
|
+
export declare class PrototypeBuildService {
|
|
26
|
+
/** Build `filesDir` (the variant's `files/`) and return the packed bundle. */
|
|
27
|
+
build(filesDir: string): Promise<BuildResult>;
|
|
28
|
+
/**
|
|
29
|
+
* Pack an already-built static bundle (a variant's `files/` dir) for upload
|
|
30
|
+
* without a build step. Used for history static-preview variants, which are
|
|
31
|
+
* already servable static sites — there's nothing to compile.
|
|
32
|
+
*/
|
|
33
|
+
packStatic(filesDir: string): Promise<BuildResult>;
|
|
34
|
+
/** Walk a directory and return every file base64-encoded. */
|
|
35
|
+
private packDir;
|
|
36
|
+
private runStep;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=PrototypeBuildService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrototypeBuildService.d.ts","sourceRoot":"","sources":["../../src/services/PrototypeBuildService.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAiBhD,qBAAa,mBAAoB,SAAQ,KAAK;IAG1C,wEAAwE;IACxE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM;gBAFxB,OAAO,EAAE,MAAM;IACf,wEAAwE;IAC/D,MAAM,CAAC,EAAE,MAAM,YAAA;CAK3B;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;CACpB;AAKD;;;;;;;;;;GAUG;AACH,qBAAa,qBAAqB;IAChC,8EAA8E;IACxE,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAkDnD;;;;OAIG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IASxD,6DAA6D;YAC/C,OAAO;IAsBrB,OAAO,CAAC,OAAO;CAqEhB"}
|
|
@@ -0,0 +1,165 @@
|
|
|
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.PrototypeBuildService = exports.PrototypeBuildError = void 0;
|
|
7
|
+
const child_process_1 = require("child_process");
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
10
|
+
const os_1 = __importDefault(require("os"));
|
|
11
|
+
const path_1 = __importDefault(require("path"));
|
|
12
|
+
const logger_1 = require("../utils/logger");
|
|
13
|
+
const log = (0, logger_1.createLogger)('PrototypeBuildService');
|
|
14
|
+
/** Dirs never copied into the build scratch — they're either huge, regenerated,
|
|
15
|
+
* or history/VCS noise. Mirrors VariantHistoryService.COPY_EXCLUDE. */
|
|
16
|
+
const COPY_EXCLUDE = new Set([
|
|
17
|
+
'node_modules',
|
|
18
|
+
'.git',
|
|
19
|
+
'.vite',
|
|
20
|
+
'.rivet',
|
|
21
|
+
'dist',
|
|
22
|
+
'build',
|
|
23
|
+
'.next',
|
|
24
|
+
'.cache',
|
|
25
|
+
]);
|
|
26
|
+
class PrototypeBuildError extends Error {
|
|
27
|
+
detail;
|
|
28
|
+
constructor(message,
|
|
29
|
+
/** Tail of the failing step's stderr, for surfacing in the UI toast. */
|
|
30
|
+
detail) {
|
|
31
|
+
super(message);
|
|
32
|
+
this.detail = detail;
|
|
33
|
+
this.name = 'PrototypeBuildError';
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.PrototypeBuildError = PrototypeBuildError;
|
|
37
|
+
const INSTALL_TIMEOUT_MS = 180_000;
|
|
38
|
+
const BUILD_TIMEOUT_MS = 120_000;
|
|
39
|
+
/**
|
|
40
|
+
* Builds a fresh-project (Vite) variant into a static bundle ready to upload to
|
|
41
|
+
* the Prototype Preview Host.
|
|
42
|
+
*
|
|
43
|
+
* The variant snapshot under `.rivet/variants/.../files/` is treated as
|
|
44
|
+
* immutable, so we copy it to an OS temp scratch dir and build there. We run
|
|
45
|
+
* `vite build --base=./` directly (not `npm run build`) so a `tsc` type error
|
|
46
|
+
* in agent-generated code doesn't block a purely visual deploy, and so asset
|
|
47
|
+
* URLs are relative (the host serves under `/p/<deployId>/` and injects a
|
|
48
|
+
* matching `<base href>`).
|
|
49
|
+
*/
|
|
50
|
+
class PrototypeBuildService {
|
|
51
|
+
/** Build `filesDir` (the variant's `files/`) and return the packed bundle. */
|
|
52
|
+
async build(filesDir) {
|
|
53
|
+
const pkgJson = path_1.default.join(filesDir, 'package.json');
|
|
54
|
+
if (!fs_1.default.existsSync(pkgJson)) {
|
|
55
|
+
throw new PrototypeBuildError('This prototype has no package.json — only fresh Vite app prototypes can be deployed.');
|
|
56
|
+
}
|
|
57
|
+
const scratch = await promises_1.default.mkdtemp(path_1.default.join(os_1.default.tmpdir(), 'rivet-deploy-'));
|
|
58
|
+
try {
|
|
59
|
+
const projectDir = path_1.default.join(scratch, 'app');
|
|
60
|
+
await promises_1.default.cp(filesDir, projectDir, {
|
|
61
|
+
recursive: true,
|
|
62
|
+
filter: (src) => !COPY_EXCLUDE.has(path_1.default.basename(src)),
|
|
63
|
+
});
|
|
64
|
+
const hasLockfile = fs_1.default.existsSync(path_1.default.join(projectDir, 'package-lock.json'));
|
|
65
|
+
await this.runStep('npm', hasLockfile ? ['ci'] : ['install', '--no-audit', '--no-fund'], projectDir, INSTALL_TIMEOUT_MS, 'install dependencies');
|
|
66
|
+
await this.runStep('npx', ['vite', 'build', '--base=./'], projectDir, BUILD_TIMEOUT_MS, 'build the prototype');
|
|
67
|
+
const distDir = path_1.default.join(projectDir, 'dist');
|
|
68
|
+
if (!fs_1.default.existsSync(path_1.default.join(distDir, 'index.html'))) {
|
|
69
|
+
throw new PrototypeBuildError('Build completed but produced no dist/index.html — unable to deploy.');
|
|
70
|
+
}
|
|
71
|
+
return await this.packDir(distDir);
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
await promises_1.default.rm(scratch, { recursive: true, force: true });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Pack an already-built static bundle (a variant's `files/` dir) for upload
|
|
79
|
+
* without a build step. Used for history static-preview variants, which are
|
|
80
|
+
* already servable static sites — there's nothing to compile.
|
|
81
|
+
*/
|
|
82
|
+
async packStatic(filesDir) {
|
|
83
|
+
if (!fs_1.default.existsSync(path_1.default.join(filesDir, 'index.html'))) {
|
|
84
|
+
throw new PrototypeBuildError('This prototype has no index.html to deploy.');
|
|
85
|
+
}
|
|
86
|
+
return this.packDir(filesDir);
|
|
87
|
+
}
|
|
88
|
+
/** Walk a directory and return every file base64-encoded. */
|
|
89
|
+
async packDir(distDir) {
|
|
90
|
+
const files = [];
|
|
91
|
+
let totalBytes = 0;
|
|
92
|
+
const walk = async (dir, prefix) => {
|
|
93
|
+
const entries = await promises_1.default.readdir(dir, { withFileTypes: true });
|
|
94
|
+
for (const entry of entries) {
|
|
95
|
+
if (COPY_EXCLUDE.has(entry.name))
|
|
96
|
+
continue;
|
|
97
|
+
const abs = path_1.default.join(dir, entry.name);
|
|
98
|
+
const rel = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
99
|
+
if (entry.isDirectory()) {
|
|
100
|
+
await walk(abs, rel);
|
|
101
|
+
}
|
|
102
|
+
else if (entry.isFile()) {
|
|
103
|
+
const body = await promises_1.default.readFile(abs);
|
|
104
|
+
totalBytes += body.length;
|
|
105
|
+
files.push({ path: rel, content: body.toString('base64') });
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
await walk(distDir, '');
|
|
110
|
+
return { files, totalBytes };
|
|
111
|
+
}
|
|
112
|
+
runStep(cmd, args, cwd, timeoutMs, label) {
|
|
113
|
+
return new Promise((resolve, reject) => {
|
|
114
|
+
const proc = (0, child_process_1.spawn)(cmd, args, {
|
|
115
|
+
cwd,
|
|
116
|
+
env: { ...process.env },
|
|
117
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
118
|
+
detached: false,
|
|
119
|
+
});
|
|
120
|
+
// Keep only the tail of stderr — enough to explain a failure without
|
|
121
|
+
// holding megabytes of npm/vite chatter in memory.
|
|
122
|
+
let stderrTail = '';
|
|
123
|
+
const appendTail = (data) => {
|
|
124
|
+
stderrTail = (stderrTail + data.toString()).slice(-4_000);
|
|
125
|
+
};
|
|
126
|
+
// Drain stdout too: with `stdio: 'pipe'` and no consumer the OS pipe
|
|
127
|
+
// buffer fills and the child blocks (same hazard as the dev-server spawn).
|
|
128
|
+
proc.stdout?.on('data', (d) => {
|
|
129
|
+
log.debug(`[deploy-build] ${d.toString().trim()}`);
|
|
130
|
+
});
|
|
131
|
+
proc.stderr?.on('data', (d) => {
|
|
132
|
+
appendTail(d);
|
|
133
|
+
log.debug(`[deploy-build] ${d.toString().trim()}`);
|
|
134
|
+
});
|
|
135
|
+
const timer = setTimeout(() => {
|
|
136
|
+
try {
|
|
137
|
+
proc.kill('SIGTERM');
|
|
138
|
+
}
|
|
139
|
+
catch { /* ignore */ }
|
|
140
|
+
setTimeout(() => {
|
|
141
|
+
try {
|
|
142
|
+
proc.kill('SIGKILL');
|
|
143
|
+
}
|
|
144
|
+
catch { /* ignore */ }
|
|
145
|
+
}, 5_000).unref();
|
|
146
|
+
reject(new PrototypeBuildError(`Timed out trying to ${label} (after ${Math.round(timeoutMs / 1000)}s).`, stderrTail.trim()));
|
|
147
|
+
}, timeoutMs);
|
|
148
|
+
proc.on('error', (err) => {
|
|
149
|
+
clearTimeout(timer);
|
|
150
|
+
reject(new PrototypeBuildError(`Failed to ${label}: ${err.message}`, stderrTail.trim()));
|
|
151
|
+
});
|
|
152
|
+
proc.on('close', (code) => {
|
|
153
|
+
clearTimeout(timer);
|
|
154
|
+
if (code === 0) {
|
|
155
|
+
resolve();
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
reject(new PrototypeBuildError(`Failed to ${label} (exit ${code}).`, stderrTail.trim()));
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
exports.PrototypeBuildService = PrototypeBuildService;
|
|
165
|
+
//# sourceMappingURL=PrototypeBuildService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrototypeBuildService.js","sourceRoot":"","sources":["../../src/services/PrototypeBuildService.ts"],"names":[],"mappings":"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"}
|