rivet-design 0.13.4 → 0.14.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 (90) hide show
  1. package/dist/agent-variants/SessionStore.d.ts +14 -3
  2. package/dist/agent-variants/SessionStore.d.ts.map +1 -1
  3. package/dist/agent-variants/SessionStore.js +9 -1
  4. package/dist/agent-variants/SessionStore.js.map +1 -1
  5. package/dist/agent-variants/WorkerExecutorService.d.ts +140 -0
  6. package/dist/agent-variants/WorkerExecutorService.d.ts.map +1 -0
  7. package/dist/agent-variants/WorkerExecutorService.js +496 -0
  8. package/dist/agent-variants/WorkerExecutorService.js.map +1 -0
  9. package/dist/agent-variants/WorktreeOrchestrator.d.ts +24 -1
  10. package/dist/agent-variants/WorktreeOrchestrator.d.ts.map +1 -1
  11. package/dist/agent-variants/WorktreeOrchestrator.js +82 -3
  12. package/dist/agent-variants/WorktreeOrchestrator.js.map +1 -1
  13. package/dist/agent-variants/contracts.d.ts +30 -13
  14. package/dist/agent-variants/contracts.d.ts.map +1 -1
  15. package/dist/agent-variants/contracts.js +11 -4
  16. package/dist/agent-variants/contracts.js.map +1 -1
  17. package/dist/agent-variants/directionAuthoring.d.ts +36 -0
  18. package/dist/agent-variants/directionAuthoring.d.ts.map +1 -0
  19. package/dist/agent-variants/directionAuthoring.js +348 -0
  20. package/dist/agent-variants/directionAuthoring.js.map +1 -0
  21. package/dist/agent-variants/runLabel.d.ts +5 -4
  22. package/dist/agent-variants/runLabel.d.ts.map +1 -1
  23. package/dist/agent-variants/runLabel.js +16 -8
  24. package/dist/agent-variants/runLabel.js.map +1 -1
  25. package/dist/agent-variants/videoKeyframes.d.ts +19 -0
  26. package/dist/agent-variants/videoKeyframes.d.ts.map +1 -0
  27. package/dist/agent-variants/videoKeyframes.js +109 -0
  28. package/dist/agent-variants/videoKeyframes.js.map +1 -0
  29. package/dist/agent-variants/workItemBriefing.d.ts +3 -1
  30. package/dist/agent-variants/workItemBriefing.d.ts.map +1 -1
  31. package/dist/agent-variants/workItemBriefing.js +34 -2
  32. package/dist/agent-variants/workItemBriefing.js.map +1 -1
  33. package/dist/cli/commands/mcpServe.d.ts.map +1 -1
  34. package/dist/cli/commands/mcpServe.js +57 -25
  35. package/dist/cli/commands/mcpServe.js.map +1 -1
  36. package/dist/cli/commands/variants.d.ts.map +1 -1
  37. package/dist/cli/commands/variants.js +294 -4
  38. package/dist/cli/commands/variants.js.map +1 -1
  39. package/dist/cli/hostWorkNextAction.d.ts.map +1 -1
  40. package/dist/cli/hostWorkNextAction.js +6 -1
  41. package/dist/cli/hostWorkNextAction.js.map +1 -1
  42. package/dist/cli/router.js +2 -2
  43. package/dist/cli/router.js.map +1 -1
  44. package/dist/hosts/workerDefaults.d.ts +42 -0
  45. package/dist/hosts/workerDefaults.d.ts.map +1 -1
  46. package/dist/hosts/workerDefaults.js +40 -1
  47. package/dist/hosts/workerDefaults.js.map +1 -1
  48. package/dist/mcp/changeBatchClassification.d.ts +2 -0
  49. package/dist/mcp/changeBatchClassification.d.ts.map +1 -1
  50. package/dist/mcp/changeBatchClassification.js +5 -0
  51. package/dist/mcp/changeBatchClassification.js.map +1 -1
  52. package/dist/routes/agentVariants.d.ts.map +1 -1
  53. package/dist/routes/agentVariants.js +34 -2
  54. package/dist/routes/agentVariants.js.map +1 -1
  55. package/dist/routes/emptyStatePage.d.ts +14 -0
  56. package/dist/routes/emptyStatePage.d.ts.map +1 -0
  57. package/dist/routes/emptyStatePage.js +601 -0
  58. package/dist/routes/emptyStatePage.js.map +1 -0
  59. package/dist/routes/static.d.ts.map +1 -1
  60. package/dist/routes/static.js +2 -73
  61. package/dist/routes/static.js.map +1 -1
  62. package/dist/services/VariantGenerationService.d.ts +36 -1
  63. package/dist/services/VariantGenerationService.d.ts.map +1 -1
  64. package/dist/services/VariantGenerationService.js +334 -13
  65. package/dist/services/VariantGenerationService.js.map +1 -1
  66. package/dist/services/VariantRunService.d.ts +8 -0
  67. package/dist/services/VariantRunService.d.ts.map +1 -1
  68. package/dist/services/VariantRunService.js +31 -6
  69. package/dist/services/VariantRunService.js.map +1 -1
  70. package/dist/services/VariantsRuntime.d.ts.map +1 -1
  71. package/dist/services/VariantsRuntime.js +9 -0
  72. package/dist/services/VariantsRuntime.js.map +1 -1
  73. package/dist/types/change-request-types.d.ts +19 -0
  74. package/dist/types/change-request-types.d.ts.map +1 -1
  75. package/dist/utils/skills/claude-skill.d.ts +2 -2
  76. package/dist/utils/skills/claude-skill.d.ts.map +1 -1
  77. package/dist/utils/skills/claude-skill.js +1 -1
  78. package/dist/utils/skills/cli-guidance.d.ts +2 -2
  79. package/dist/utils/skills/cli-guidance.d.ts.map +1 -1
  80. package/dist/utils/skills/cli-guidance.js +11 -8
  81. package/dist/utils/skills/cli-guidance.js.map +1 -1
  82. package/dist/utils/skills/cursor-rules.d.ts +2 -2
  83. package/dist/utils/skills/cursor-rules.d.ts.map +1 -1
  84. package/dist/utils/skills/cursor-rules.js +1 -1
  85. package/package.json +1 -1
  86. package/src/ui/dist/assets/main-CobdEReL.css +1 -0
  87. package/src/ui/dist/assets/main-DJjaeK_0.js +422 -0
  88. package/src/ui/dist/index.html +2 -2
  89. package/src/ui/dist/assets/main-Dyos9I29.css +0 -1
  90. package/src/ui/dist/assets/main-T3U4Gt16.js +0 -419
@@ -0,0 +1,496 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WorkerExecutorService = exports.isWorkerExecutorEnabled = exports.EXECUTOR_LEASE_OWNER = void 0;
4
+ const child_process_1 = require("child_process");
5
+ const logger_1 = require("../utils/logger");
6
+ const workItemBriefing_1 = require("./workItemBriefing");
7
+ const workerDefaults_1 = require("../hosts/workerDefaults");
8
+ const contracts_1 = require("./contracts");
9
+ const log = (0, logger_1.createLogger)('WorkerExecutor');
10
+ /** Lease owner marking work the executor runs — hosts must not implement it. */
11
+ exports.EXECUTOR_LEASE_OWNER = 'rivet-executor';
12
+ /**
13
+ * The executor is the DEFAULT execution path for variant workers: leaner,
14
+ * cheaper, and deterministic vs host-agent subagents (see PR #948 evidence).
15
+ * RIVET_EXECUTOR=0 opts a machine out; the runtime preflight falls back to
16
+ * the host path automatically when no worker binary is available. Fresh
17
+ * (zero-to-one / vite) lanes remain host-executed pending executor ownership
18
+ * of scaffold and source-plan steps.
19
+ */
20
+ const isWorkerExecutorEnabled = (env = process.env) => {
21
+ const flag = (env.RIVET_EXECUTOR ?? '').trim().toLowerCase();
22
+ return flag !== '0' && flag !== 'false' && flag !== 'off';
23
+ };
24
+ exports.isWorkerExecutorEnabled = isWorkerExecutorEnabled;
25
+ /** Parse the final result object the headless CLI prints on stdout. Returns
26
+ * undefined on any shape surprise — usage capture must never fail a run. */
27
+ const parseWorkerUsage = (stdout) => {
28
+ try {
29
+ const trimmed = stdout.trim();
30
+ const start = trimmed.indexOf('{');
31
+ if (start === -1)
32
+ return undefined;
33
+ const parsed = JSON.parse(trimmed.slice(start));
34
+ const usage = parsed.usage;
35
+ if (!usage && typeof parsed.total_cost_usd !== 'number')
36
+ return undefined;
37
+ const sum = (...values) => values.reduce((total, value) => total + (typeof value === 'number' ? value : 0), 0);
38
+ return {
39
+ ...(usage
40
+ ? {
41
+ tokensIn: sum(usage.input_tokens, usage.cache_read_input_tokens, usage.cache_creation_input_tokens),
42
+ tokensOut: sum(usage.output_tokens),
43
+ }
44
+ : {}),
45
+ ...(typeof parsed.total_cost_usd === 'number'
46
+ ? { costUsd: parsed.total_cost_usd }
47
+ : {}),
48
+ };
49
+ }
50
+ catch {
51
+ return undefined;
52
+ }
53
+ };
54
+ const defaultSpawn = ({ command, args, cwd }) => (0, child_process_1.spawn)(command, args, {
55
+ cwd,
56
+ stdio: ['pipe', 'pipe', 'pipe'],
57
+ // Own process group so a timeout/cancel kills the whole worker tree.
58
+ detached: process.platform !== 'win32',
59
+ });
60
+ const DEFAULT_TIMEOUT_MS = 10 * 60 * 1000;
61
+ const DEFAULT_MAX_CONCURRENT = 3;
62
+ const isExecutableImplementationItem = (item) => ('workspace' in item &&
63
+ (item.kind === 'static_preview' || item.kind === 'refine_variant') &&
64
+ item.workspace.kind === 'artifact_directory') ||
65
+ ('workspace' in item &&
66
+ item.kind === 'code_gen' &&
67
+ item.workspace.kind === 'git_worktree');
68
+ /**
69
+ * M0 worker executor: runs artifact-backed implementation work items as
70
+ * headless worker processes instead of host-agent subagents. The briefing is
71
+ * the entire prompt; completion is observed (process exit) and reported by
72
+ * the executor — workers cannot forget, batch, or mis-transport it. One QA
73
+ * requeue is honored per item, matching the host path's single retry.
74
+ */
75
+ class WorkerExecutorService {
76
+ orchestrator;
77
+ telemetry;
78
+ workerCommand;
79
+ workerModel;
80
+ workerEffort;
81
+ referenceCreateModel;
82
+ referenceCreateEffort;
83
+ workerTierOverridden;
84
+ referenceCreateTierOverridden;
85
+ timeoutMs;
86
+ runtimeAvailable;
87
+ childrenBySession = new Map();
88
+ maxConcurrent;
89
+ spawnWorker;
90
+ active = 0;
91
+ waiters = [];
92
+ constructor(options) {
93
+ this.orchestrator = options.orchestrator;
94
+ this.telemetry = options.telemetry;
95
+ this.workerCommand =
96
+ options.workerCommand ?? process.env.RIVET_EXECUTOR_COMMAND ?? 'claude';
97
+ // Explicit tier overrides (constructor options or env) are the ops
98
+ // escape hatch and outrank the user's per-run fidelity selection.
99
+ this.workerTierOverridden = Boolean(options.workerModel ??
100
+ options.workerEffort ??
101
+ process.env.RIVET_EXECUTOR_MODEL ??
102
+ process.env.RIVET_EXECUTOR_EFFORT);
103
+ this.referenceCreateTierOverridden = Boolean(options.referenceCreateModel ??
104
+ options.referenceCreateEffort ??
105
+ process.env.RIVET_EXECUTOR_REFERENCE_CREATE_MODEL ??
106
+ process.env.RIVET_EXECUTOR_REFERENCE_CREATE_EFFORT);
107
+ this.workerModel =
108
+ options.workerModel ??
109
+ process.env.RIVET_EXECUTOR_MODEL ??
110
+ workerDefaults_1.RIVET_WORKER_DEFAULTS.model;
111
+ this.workerEffort =
112
+ options.workerEffort ??
113
+ process.env.RIVET_EXECUTOR_EFFORT ??
114
+ workerDefaults_1.RIVET_WORKER_DEFAULTS.effort;
115
+ this.referenceCreateModel =
116
+ options.referenceCreateModel ??
117
+ process.env.RIVET_EXECUTOR_REFERENCE_CREATE_MODEL ??
118
+ workerDefaults_1.RIVET_WORKER_REFERENCE_CREATE_DEFAULTS.model;
119
+ this.referenceCreateEffort =
120
+ options.referenceCreateEffort ??
121
+ process.env.RIVET_EXECUTOR_REFERENCE_CREATE_EFFORT ??
122
+ workerDefaults_1.RIVET_WORKER_REFERENCE_CREATE_DEFAULTS.effort;
123
+ this.timeoutMs =
124
+ options.timeoutMs ??
125
+ Number(process.env.RIVET_EXECUTOR_TIMEOUT_MS ?? DEFAULT_TIMEOUT_MS);
126
+ this.maxConcurrent = options.maxConcurrent ?? DEFAULT_MAX_CONCURRENT;
127
+ this.spawnWorker = options.spawnWorker ?? defaultSpawn;
128
+ }
129
+ /**
130
+ * True when the worker runtime binary is invocable. Checked once —
131
+ * callers use this to fall back to the host-agent path BEFORE leasing,
132
+ * so an executor-less machine behaves exactly as before the flag.
133
+ */
134
+ isRuntimeAvailable() {
135
+ if (this.runtimeAvailable === undefined) {
136
+ try {
137
+ (0, child_process_1.execFileSync)(this.workerCommand, ['--version'], {
138
+ stdio: 'ignore',
139
+ timeout: 10_000,
140
+ });
141
+ this.runtimeAvailable = true;
142
+ }
143
+ catch {
144
+ log.warn(`worker runtime '${this.workerCommand}' unavailable — executor falling back to host path`);
145
+ this.runtimeAvailable = false;
146
+ }
147
+ }
148
+ return this.runtimeAvailable;
149
+ }
150
+ /** Kill every in-flight worker for a session (cancel/teardown). */
151
+ cancelSession(sessionId) {
152
+ for (const pid of this.childrenBySession.get(sessionId) ?? []) {
153
+ this.killTree(pid);
154
+ }
155
+ this.childrenBySession.delete(sessionId);
156
+ }
157
+ /**
158
+ * Run the given leased work items to terminal state. Fire-and-forget from
159
+ * the caller's perspective; failures surface as failed variants, never as
160
+ * thrown errors on the intake path. Pass the caller's lease so ids that
161
+ * never appear in the session snapshot can still be terminal-failed.
162
+ */
163
+ async run(sessionId, workItemIds, lease) {
164
+ const claimed = new Set(workItemIds);
165
+ const claimedItems = this.orchestrator
166
+ .getHostWork(sessionId)
167
+ .filter((item) => claimed.has(item.workId));
168
+ const runnable = claimedItems.filter(isExecutableImplementationItem);
169
+ // Anything we claimed but cannot execute must still reach a terminal
170
+ // state — a silently dropped executor lease would strand the variant
171
+ // (hosts skip executor-owned items in nextAction).
172
+ const stranded = claimedItems.filter((item) => !runnable.some((candidate) => candidate.workId === item.workId));
173
+ // Claimed ids missing from the snapshot entirely (raced session mutation,
174
+ // filtered state) hold an executor lease no host can see — terminal-fail
175
+ // them on the caller's lease rather than stranding until lease expiry.
176
+ const unseen = workItemIds.filter((workItemId) => !claimedItems.some((item) => item.workId === workItemId));
177
+ await Promise.all([
178
+ ...runnable.map((item) => this.runOne(sessionId, item, { retried: false })),
179
+ ...stranded.map((item) => this.reportSafely(sessionId, {
180
+ workItemId: item.workId,
181
+ leaseId: item.leaseId,
182
+ attempt: item.attempt,
183
+ status: 'failed',
184
+ error: {
185
+ code: 'EXECUTOR_UNSUPPORTED_ITEM',
186
+ message: `executor cannot run kind=${item.kind}`,
187
+ },
188
+ })),
189
+ ...unseen.map((workItemId) => {
190
+ if (!lease) {
191
+ log.error(`executor claimed ${workItemId} but it is missing from the session snapshot and no lease context was provided — item may be stranded until lease expiry`);
192
+ return Promise.resolve({});
193
+ }
194
+ return this.reportSafely(sessionId, {
195
+ workItemId,
196
+ leaseId: lease.leaseId,
197
+ attempt: lease.items.find((item) => item.id === workItemId)?.attempt ?? 1,
198
+ status: 'failed',
199
+ error: {
200
+ code: 'EXECUTOR_ITEM_UNSEEN',
201
+ message: 'claimed work item missing from the session snapshot at run time',
202
+ },
203
+ });
204
+ }),
205
+ ]);
206
+ }
207
+ /** reportComplete that can never strand a lease: a throw on a succeeded
208
+ * report (e.g. invalid artifact) is converted into a failed report so the
209
+ * item reaches a terminal state either way. */
210
+ async reportSafely(sessionId, args) {
211
+ try {
212
+ return await this.orchestrator.reportComplete({ sessionId, ...args });
213
+ }
214
+ catch (error) {
215
+ const message = error instanceof Error ? error.message : String(error);
216
+ if (args.status === 'failed') {
217
+ log.warn(`executor failed-report rejected for ${args.workItemId}`, error);
218
+ return {};
219
+ }
220
+ log.warn(`executor success report rejected for ${args.workItemId} — recording failure`, error);
221
+ try {
222
+ return await this.orchestrator.reportComplete({
223
+ sessionId,
224
+ workItemId: args.workItemId,
225
+ leaseId: args.leaseId,
226
+ attempt: args.attempt,
227
+ status: 'failed',
228
+ error: { code: 'EXECUTOR_ARTIFACT_INVALID', message },
229
+ });
230
+ }
231
+ catch (secondError) {
232
+ log.warn(`executor terminal-failure report rejected for ${args.workItemId}`, secondError);
233
+ return {};
234
+ }
235
+ }
236
+ }
237
+ /** Model/effort tier for one work item.
238
+ *
239
+ * Precedence: explicit ops overrides (constructor options / RIVET_EXECUTOR_*
240
+ * env) > the run's user-selected fidelity ({@link FIDELITY_WORKER_TIERS})
241
+ * > lane defaults. Reference-backed creates keep their own override lane
242
+ * because reference fidelity is the deliverable there. */
243
+ workerTierFor(item) {
244
+ const referenceBacked = Boolean(item.contextFiles?.length || item.contextBundlePath);
245
+ const isReferenceCreate = item.mode === 'create' && referenceBacked;
246
+ const overridden = isReferenceCreate
247
+ ? this.referenceCreateTierOverridden
248
+ : this.workerTierOverridden;
249
+ if (!overridden && (0, contracts_1.isWorkerFidelity)(item.fidelity)) {
250
+ return workerDefaults_1.FIDELITY_WORKER_TIERS[item.fidelity];
251
+ }
252
+ if (isReferenceCreate) {
253
+ return {
254
+ model: this.referenceCreateModel,
255
+ effort: this.referenceCreateEffort,
256
+ };
257
+ }
258
+ return { model: this.workerModel, effort: this.workerEffort };
259
+ }
260
+ async runOne(sessionId, item, state) {
261
+ await this.acquire();
262
+ const startedAt = Date.now();
263
+ const tier = this.workerTierFor(item);
264
+ this.telemetry?.track('agent_variants.executor_worker_started', {
265
+ source: 'mcp',
266
+ sessionId,
267
+ workItemId: item.workId,
268
+ model: tier.model,
269
+ effort: tier.effort,
270
+ fidelity: item.fidelity ?? null,
271
+ attempt: item.attempt,
272
+ });
273
+ let outcome;
274
+ try {
275
+ outcome = await this.spawnAndWait(sessionId, item);
276
+ }
277
+ catch (error) {
278
+ outcome = {
279
+ status: 'failed',
280
+ message: error instanceof Error ? error.message : String(error),
281
+ };
282
+ }
283
+ finally {
284
+ this.release();
285
+ }
286
+ this.telemetry?.track('agent_variants.executor_worker_exited', {
287
+ source: 'mcp',
288
+ sessionId,
289
+ workItemId: item.workId,
290
+ durationMs: Date.now() - startedAt,
291
+ status: outcome.status,
292
+ tokensIn: outcome.usage?.tokensIn ?? null,
293
+ tokensOut: outcome.usage?.tokensOut ?? null,
294
+ costUsd: outcome.usage?.costUsd ?? null,
295
+ });
296
+ const result = await this.reportSafely(sessionId, {
297
+ workItemId: item.workId,
298
+ leaseId: item.leaseId,
299
+ attempt: item.attempt,
300
+ status: outcome.status,
301
+ ...(outcome.usage?.tokensIn !== undefined
302
+ ? { tokensIn: outcome.usage.tokensIn }
303
+ : {}),
304
+ ...(outcome.usage?.tokensOut !== undefined
305
+ ? { tokensOut: outcome.usage.tokensOut }
306
+ : {}),
307
+ ...(outcome.usage?.costUsd !== undefined
308
+ ? { costUsd: outcome.usage.costUsd }
309
+ : {}),
310
+ model: tier.model,
311
+ ...(outcome.status === 'succeeded' &&
312
+ item.kind === 'code_gen' &&
313
+ item.workspace.kind === 'git_worktree'
314
+ ? {
315
+ output: {
316
+ worktreePath: item.workspace.rootPath,
317
+ changedFiles: [],
318
+ },
319
+ }
320
+ : {}),
321
+ ...(outcome.status === 'failed'
322
+ ? {
323
+ error: {
324
+ code: 'EXECUTOR_WORKER_FAILED',
325
+ message: outcome.message ?? 'worker failed',
326
+ },
327
+ }
328
+ : {}),
329
+ });
330
+ if (result.requeuedForRegeneration && !state.retried) {
331
+ try {
332
+ const renewedLease = this.orchestrator.requestWork({
333
+ sessionId,
334
+ workItemIds: [item.workId],
335
+ leaseOwner: exports.EXECUTOR_LEASE_OWNER,
336
+ });
337
+ const renewed = this.orchestrator
338
+ .getHostWork(sessionId)
339
+ .filter(isExecutableImplementationItem)
340
+ .find((candidate) => candidate.workId === item.workId);
341
+ if (renewed) {
342
+ await this.runOne(sessionId, renewed, { retried: true });
343
+ return;
344
+ }
345
+ // Renewed lease exists but the item is not visible/executable —
346
+ // terminal-fail it on the new lease rather than stranding it.
347
+ const renewedAttempt = renewedLease.leasedWorkItems.find((leased) => leased.id === item.workId)?.attempt ?? item.attempt + 1;
348
+ await this.reportSafely(sessionId, {
349
+ workItemId: item.workId,
350
+ leaseId: renewedLease.leaseId,
351
+ attempt: renewedAttempt,
352
+ status: 'failed',
353
+ error: {
354
+ code: 'EXECUTOR_REQUEUE_LOST',
355
+ message: 'requeued item was not re-runnable by the executor',
356
+ },
357
+ });
358
+ }
359
+ catch (error) {
360
+ log.warn(`executor requeue retry failed for ${item.workId}`, error);
361
+ // Terminal-state invariant: a requeued item left pending with no
362
+ // lease is invisible to hosts (they skip executor-owned work) and
363
+ // would strand the session. Make one more lease attempt purely to
364
+ // record a terminal failure.
365
+ try {
366
+ const salvageLease = this.orchestrator.requestWork({
367
+ sessionId,
368
+ workItemIds: [item.workId],
369
+ leaseOwner: exports.EXECUTOR_LEASE_OWNER,
370
+ });
371
+ const salvageAttempt = salvageLease.leasedWorkItems.find((leased) => leased.id === item.workId)?.attempt ?? item.attempt + 1;
372
+ await this.reportSafely(sessionId, {
373
+ workItemId: item.workId,
374
+ leaseId: salvageLease.leaseId,
375
+ attempt: salvageAttempt,
376
+ status: 'failed',
377
+ error: {
378
+ code: 'EXECUTOR_REQUEUE_LOST',
379
+ message: 'executor requeue retry failed; recording terminal failure',
380
+ },
381
+ });
382
+ }
383
+ catch (salvageError) {
384
+ log.error(`executor could not terminal-fail requeued ${item.workId} — item may be stranded until lease expiry`, salvageError);
385
+ }
386
+ }
387
+ }
388
+ }
389
+ spawnAndWait(sessionId, item) {
390
+ const tier = this.workerTierFor(item);
391
+ const prompt = (0, workItemBriefing_1.renderWorkItemBriefing)(item, { completion: 'executor' });
392
+ const child = this.spawnWorker({
393
+ command: this.workerCommand,
394
+ args: [
395
+ '--print',
396
+ '--output-format',
397
+ 'json',
398
+ '--model',
399
+ tier.model,
400
+ '--effort',
401
+ tier.effort,
402
+ '--dangerously-skip-permissions',
403
+ '--allowed-tools',
404
+ 'Read,Write,Edit,Bash,Glob,Grep',
405
+ // Workers of one session differ only by cwd/briefing; moving the
406
+ // per-machine sections out of the system prompt lets the N parallel
407
+ // workers (and QA-requeue retries) share one prompt-cache prefix.
408
+ '--exclude-dynamic-system-prompt-sections',
409
+ ],
410
+ cwd: item.workspace.kind === 'git_worktree'
411
+ ? item.workspace.projectPath
412
+ : item.workspace.rootPath,
413
+ prompt,
414
+ });
415
+ if (child.pid) {
416
+ const children = this.childrenBySession.get(sessionId) ?? new Set();
417
+ children.add(child.pid);
418
+ this.childrenBySession.set(sessionId, children);
419
+ child.on('close', () => children.delete(child.pid));
420
+ }
421
+ child.stdin?.write(prompt);
422
+ child.stdin?.end();
423
+ let stderrTail = '';
424
+ child.stderr?.on('data', (chunk) => {
425
+ stderrTail = (stderrTail + chunk.toString()).slice(-2000);
426
+ });
427
+ // Keep stdout drained (a full pipe would block the worker). The JSON
428
+ // result object is the final output — retain a bounded tail for usage.
429
+ let stdoutTail = '';
430
+ child.stdout?.on('data', (chunk) => {
431
+ stdoutTail = (stdoutTail + chunk.toString()).slice(-131072);
432
+ });
433
+ return new Promise((resolve) => {
434
+ const timer = setTimeout(() => {
435
+ this.killTree(child.pid);
436
+ resolve({
437
+ status: 'failed',
438
+ message: `worker timed out after ${this.timeoutMs}ms`,
439
+ });
440
+ }, this.timeoutMs);
441
+ child.on('error', (error) => {
442
+ clearTimeout(timer);
443
+ resolve({ status: 'failed', message: error.message });
444
+ });
445
+ child.on('close', (code) => {
446
+ clearTimeout(timer);
447
+ const usage = parseWorkerUsage(stdoutTail);
448
+ resolve(code === 0
449
+ ? { status: 'succeeded', ...(usage ? { usage } : {}) }
450
+ : {
451
+ status: 'failed',
452
+ message: `worker exited ${code}: ${stderrTail.slice(-400)}`,
453
+ ...(usage ? { usage } : {}),
454
+ });
455
+ });
456
+ });
457
+ }
458
+ killTree(pid) {
459
+ if (!pid)
460
+ return;
461
+ try {
462
+ if (process.platform === 'win32') {
463
+ process.kill(pid, 'SIGKILL');
464
+ return;
465
+ }
466
+ process.kill(-pid, 'SIGKILL');
467
+ }
468
+ catch {
469
+ // Not a group leader (or group already gone) — kill the process itself.
470
+ try {
471
+ process.kill(pid, 'SIGKILL');
472
+ }
473
+ catch {
474
+ // Already gone.
475
+ }
476
+ }
477
+ }
478
+ acquire() {
479
+ if (this.active < this.maxConcurrent) {
480
+ this.active += 1;
481
+ return Promise.resolve();
482
+ }
483
+ return new Promise((resolve) => this.waiters.push(() => {
484
+ this.active += 1;
485
+ resolve();
486
+ }));
487
+ }
488
+ release() {
489
+ this.active -= 1;
490
+ const next = this.waiters.shift();
491
+ if (next)
492
+ next();
493
+ }
494
+ }
495
+ exports.WorkerExecutorService = WorkerExecutorService;
496
+ //# sourceMappingURL=WorkerExecutorService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkerExecutorService.js","sourceRoot":"","sources":["../../src/agent-variants/WorkerExecutorService.ts"],"names":[],"mappings":"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"}
@@ -393,6 +393,10 @@ export declare class AgentVariantsOrchestrator {
393
393
  /** Build the snapshot the chip cares about. Reads from SessionStore +
394
394
  * per-resource state; safe to call at any time. */
395
395
  buildActiveSnapshot(): ActiveSnapshot;
396
+ /** User reference files stored in the work item's context bundle (uploaded
397
+ * or copied local images). Surfaced on the snapshot so briefings can point
398
+ * workers at the files directly — one Read instead of a bundle walk. */
399
+ private static contextFilesOf;
396
400
  getHostWork(sessionId: string): HostVariantWorkItemSnapshot[];
397
401
  private getAssignedWorkspace;
398
402
  private getVariantsTelemetryMode;
@@ -447,6 +451,7 @@ export declare class AgentVariantsOrchestrator {
447
451
  instruction: string;
448
452
  count?: number;
449
453
  briefs?: StartVariantsBriefContent[];
454
+ runLabel?: string;
450
455
  element?: StaticPreviewTargetElement;
451
456
  relevantFiles?: string[];
452
457
  requestId?: string;
@@ -555,6 +560,17 @@ export declare class AgentVariantsOrchestrator {
555
560
  getProjectCwdInWorktree(worktreePath: string): Promise<string>;
556
561
  /** Resolve the dev server port for a code-gen work item, if running. */
557
562
  getDevServerPort(sessionId: string, workItemId: string): number | undefined;
563
+ /**
564
+ * Restores a Rivet-owned variant preview that the active-session idle timer
565
+ * reclaimed. Other missing-preview causes remain terminal so this path never
566
+ * attempts to restart user-owned or repeatedly failing servers.
567
+ *
568
+ * @effect Clears the idle marker, starts the worktree dev server, and emits
569
+ * preview-state snapshots.
570
+ * @deps Uses the live session resources, project context, and dev-server
571
+ * manager owned by this orchestrator.
572
+ */
573
+ restoreVariantPreview(sessionId: string, workItemId: string): Promise<number | undefined>;
558
574
  /**
559
575
  * @effect Resolves the dev server port for a preview request and refreshes
560
576
  * active-preview retention for that session while the port is still live.
@@ -625,7 +641,7 @@ export declare class AgentVariantsOrchestrator {
625
641
  * bundle (whose on-disk path embeds the session id) before the session
626
642
  * exists, then hand both in together. Defaults to a fresh id. */
627
643
  sessionId?: string;
628
- /** Agent-supplied 1–2 word label for the run's intent (heuristic fallback
644
+ /** Agent-supplied short label for the run's intent (heuristic fallback
629
645
  * when absent). Shared by every variant in the run. */
630
646
  runLabel?: string;
631
647
  /** When provided, the orchestrator leases all spawned variant work
@@ -655,6 +671,10 @@ export declare class AgentVariantsOrchestrator {
655
671
  /** Known project files from the initiating selection. Workers inspect
656
672
  * these first and expand only when dependencies require it. */
657
673
  relevantFiles?: string[];
674
+ /** User-selected design fidelity (worker tier selector). New sessions
675
+ * stamp it onto every implementation item; accumulated batches inherit
676
+ * the existing session's fidelity. */
677
+ fidelity?: import('./contracts').WorkerFidelity;
658
678
  }): Promise<{
659
679
  sessionId: string;
660
680
  variants: Array<{
@@ -720,6 +740,9 @@ export declare class AgentVariantsOrchestrator {
720
740
  tokensIn?: number;
721
741
  tokensOut?: number;
722
742
  model?: string;
743
+ /** Worker cost in USD (executor-run workers bill outside any host
744
+ * session; this keeps them cost-accountable in telemetry). */
745
+ costUsd?: number;
723
746
  title?: string;
724
747
  description?: string;
725
748
  }): Promise<ReportCompleteResult>;