rivet-design 0.26.2 → 0.27.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.
Files changed (94) hide show
  1. package/dist/agent-variants/DirectionRefReservations.d.ts +11 -0
  2. package/dist/agent-variants/DirectionRefReservations.js +47 -0
  3. package/dist/agent-variants/PreviewRuntime.js +20 -7
  4. package/dist/agent-variants/SessionStore.d.ts +10 -1
  5. package/dist/agent-variants/SessionStore.js +25 -2
  6. package/dist/agent-variants/WorkItemRequestTimes.d.ts +6 -0
  7. package/dist/agent-variants/WorkItemRequestTimes.js +21 -0
  8. package/dist/agent-variants/WorktreeOrchestrator.d.ts +2 -1
  9. package/dist/agent-variants/WorktreeOrchestrator.js +92 -78
  10. package/dist/agent-variants/contracts.d.ts +120 -116
  11. package/dist/agent-variants/existingStaticEntry.d.ts +34 -0
  12. package/dist/agent-variants/existingStaticEntry.js +136 -0
  13. package/dist/agent-variants/staticPreviewFiles.js +1 -1
  14. package/dist/agent-variants/variant-project-runtime.d.ts +2 -1
  15. package/dist/agent-variants/variantsTelemetry.d.ts +8 -0
  16. package/dist/agent-variants/variantsTelemetry.js +5 -0
  17. package/dist/agent-variants/workItemInput.d.ts +168 -146
  18. package/dist/agent-variants/workItemInput.js +12 -1
  19. package/dist/cli/commands/directionTarget.d.ts +23 -0
  20. package/dist/cli/commands/directionTarget.js +87 -0
  21. package/dist/cli/commands/mcpServe.js +1 -0
  22. package/dist/cli/commands/open.js +28 -4
  23. package/dist/cli/commands/serve.js +2 -0
  24. package/dist/cli/commands/variants.js +36 -43
  25. package/dist/cli/envelope.d.ts +1 -1
  26. package/dist/cli/envelope.js +1 -0
  27. package/dist/cli/handoff.d.ts +1 -0
  28. package/dist/cli/handoff.js +20 -4
  29. package/dist/cli/projectRuntimeUpgrade.d.ts +11 -0
  30. package/dist/cli/projectRuntimeUpgrade.js +43 -11
  31. package/dist/cli/router.js +1 -0
  32. package/dist/cli/telemetry.d.ts +10 -0
  33. package/dist/cli/telemetry.js +37 -1
  34. package/dist/config/pluginMetrics.js +38 -0
  35. package/dist/index.d.ts +19 -0
  36. package/dist/index.js +14 -5
  37. package/dist/mcp/explorationSchema.js +1 -1
  38. package/dist/mcp/getExploration.js +11 -5
  39. package/dist/proxy-middleware/proxy-config.js +7 -0
  40. package/dist/routes/agentVariants.js +4 -0
  41. package/dist/routes/cli.js +10 -1
  42. package/dist/routes/library/middleware.js +11 -5
  43. package/dist/server.js +20 -6
  44. package/dist/services/DependencyPreparationService.js +57 -19
  45. package/dist/services/GuidanceVerifierRunner.js +4 -4
  46. package/dist/services/ProjectLibrary.d.ts +4 -1
  47. package/dist/services/ProjectLibrary.js +14 -9
  48. package/dist/services/ProjectPackageManager.d.ts +5 -0
  49. package/dist/services/ProjectPackageManager.js +33 -11
  50. package/dist/services/ProjectRuntimeService.d.ts +8 -0
  51. package/dist/services/ProjectRuntimeService.js +15 -2
  52. package/dist/services/TelemetryService.d.ts +13 -2
  53. package/dist/services/TelemetryService.js +29 -0
  54. package/dist/services/VariantHistoryService.d.ts +8 -0
  55. package/dist/services/VariantHistoryService.js +40 -0
  56. package/dist/services/WorktreeManager.d.ts +1 -0
  57. package/dist/services/WorktreeManager.js +17 -0
  58. package/dist/services/createAgentVariantsOrchestrator.js +9 -2
  59. package/dist/services/directionRefs.d.ts +21 -0
  60. package/dist/services/directionRefs.js +148 -0
  61. package/dist/services/profiles/DesignProfiles.js +16 -8
  62. package/dist/services/projectDirections.d.ts +22 -0
  63. package/dist/services/projectDirections.js +38 -0
  64. package/dist/types/direction-ref.d.ts +36 -0
  65. package/dist/types/direction-ref.js +3 -0
  66. package/dist/types/guidance-verifier.d.ts +7 -5
  67. package/dist/types/guidance-verifier.js +14 -1
  68. package/dist/types/variant-history.d.ts +3 -1
  69. package/dist/utils/devServerError.d.ts +5 -0
  70. package/dist/utils/devServerError.js +4 -0
  71. package/dist/utils/failureReason.d.ts +16 -0
  72. package/dist/utils/failureReason.js +106 -0
  73. package/dist/utils/hostedLogPrivacy.d.ts +1 -0
  74. package/dist/utils/hostedLogPrivacy.js +10 -4
  75. package/dist/utils/skills/claude-skill.d.ts +1 -1
  76. package/dist/utils/skills/claude-skill.js +1 -1
  77. package/dist/utils/skills/cli-guidance.d.ts +1 -1
  78. package/dist/utils/skills/cli-guidance.js +7 -6
  79. package/dist/utils/skills/cursor-rules.d.ts +1 -1
  80. package/dist/utils/skills/cursor-rules.js +1 -1
  81. package/dist/utils/subprocessEnvironment.d.ts +1 -1
  82. package/dist/utils/subprocessEnvironment.js +0 -1
  83. package/package.json +4 -4
  84. package/src/ui/dist/assets/LibraryEntry-BZ5EdFgA.js +37 -0
  85. package/src/ui/dist/assets/main-MepMmTwb.css +1 -0
  86. package/src/ui/dist/assets/main-RriU35pI.js +497 -0
  87. package/src/ui/dist/index.html +2 -2
  88. package/dist/services/StaticPreviewServer.d.ts +0 -8
  89. package/dist/services/StaticPreviewServer.js +0 -207
  90. package/src/ui/dist/assets/LibraryEntry-92R_T-Xa.js +0 -37
  91. package/src/ui/dist/assets/main-D0UmAaUe.css +0 -1
  92. package/src/ui/dist/assets/main-DgEfJvYu.js +0 -497
  93. package/src/ui/dist/fonts/Goldman-Bold.woff2 +0 -0
  94. package/src/ui/dist/fonts/Goldman-Regular.woff2 +0 -0
@@ -8,6 +8,7 @@ const workItemContextFiles_1 = require("./workItemContextFiles");
8
8
  const staticPreviewFiles_1 = require("./staticPreviewFiles");
9
9
  const workItemPreviewRoutes_1 = require("./workItemPreviewRoutes");
10
10
  const staticPreviewRefinements_1 = require("./staticPreviewRefinements");
11
+ const WorkItemRequestTimes_1 = require("./WorkItemRequestTimes");
11
12
  const crypto_1 = require("crypto");
12
13
  const events_1 = require("events");
13
14
  const fs_1 = __importDefault(require("fs"));
@@ -20,6 +21,7 @@ const workItemBriefing_1 = require("./workItemBriefing");
20
21
  const briefContent_1 = require("./briefContent");
21
22
  const runLabel_1 = require("./runLabel");
22
23
  const previewQa_1 = require("./previewQa");
24
+ const workItemInput_1 = require("./workItemInput");
23
25
  const WorkspaceInventory_1 = require("./WorkspaceInventory");
24
26
  const WorkspaceProvisioning_1 = require("./WorkspaceProvisioning");
25
27
  const PreviewRuntime_1 = require("./PreviewRuntime");
@@ -31,6 +33,7 @@ const variantsTelemetry_1 = require("./variantsTelemetry");
31
33
  const variantWorkspaceFiles_1 = require("./variantWorkspaceFiles");
32
34
  const errorMessage_1 = require("../utils/errorMessage");
33
35
  const pathContainment_1 = require("../utils/pathContainment");
36
+ const existingStaticEntry_1 = require("./existingStaticEntry");
34
37
  var variantWorkspaceFiles_2 = require("./variantWorkspaceFiles");
35
38
  Object.defineProperty(exports, "buildStaticPreviewDocument", { enumerable: true, get: function () { return variantWorkspaceFiles_2.buildStaticPreviewDocument; } });
36
39
  const log = (0, logger_1.createLogger)('AgentVariantsOrchestrator');
@@ -426,6 +429,7 @@ class AgentVariantsOrchestrator {
426
429
  leaseExpiresAt: item.leaseExpiresAt,
427
430
  workspace,
428
431
  mode,
432
+ ...(0, workItemInput_1.shownDirectionRef)(input),
429
433
  direction: {
430
434
  label: input.briefLabel ?? 'Variant',
431
435
  brief: input.briefBody ?? input.instruction ?? 'Create this variant',
@@ -487,6 +491,7 @@ class AgentVariantsOrchestrator {
487
491
  resources.currentRoundStartedAt = startedAt;
488
492
  resources.currentRoundMode = args.mode;
489
493
  resources.currentRoundWorkItemIds = workItemIds;
494
+ resources.requestTimes.record(workItemIds ?? [], startedAt);
490
495
  const projectContext = this.store.getProjectContext(args.sessionId);
491
496
  this.telemetry.trackAgentVariantsRoundStarted?.({
492
497
  sessionId: args.sessionId,
@@ -565,6 +570,7 @@ class AgentVariantsOrchestrator {
565
570
  const workItemIds = [...args.workItemIds];
566
571
  round.workItemIds = workItemIds;
567
572
  resources.currentRoundWorkItemIds = workItemIds;
573
+ resources.requestTimes.record(workItemIds, round.startedAt);
568
574
  this.completeTerminalVariantsRounds(args.sessionId);
569
575
  }
570
576
  completeTerminalVariantsRounds(sessionId) {
@@ -646,6 +652,8 @@ class AgentVariantsOrchestrator {
646
652
  };
647
653
  }
648
654
  trackRefinementLeased(args) {
655
+ const requestTimes = this.resources.get(args.sessionId)?.requestTimes;
656
+ const leasedAt = Date.now();
649
657
  for (const item of args.lease.leasedWorkItems) {
650
658
  const telemetry = this.refinementTelemetryForWorkItem({
651
659
  sessionId: args.sessionId,
@@ -657,6 +665,7 @@ class AgentVariantsOrchestrator {
657
665
  this.telemetry.trackAgentVariantsRefinementLeased?.({
658
666
  ...telemetry,
659
667
  leaseDurationMs: args.lease.leaseTtlMs,
668
+ queueWaitMs: requestTimes?.elapsedSinceRequestMs(item.id, leasedAt) ?? undefined,
660
669
  workItemCount: 1,
661
670
  });
662
671
  }
@@ -788,13 +797,16 @@ class AgentVariantsOrchestrator {
788
797
  }
789
798
  }
790
799
  beginStaticPreviewRefinements(args) {
791
- return (0, staticPreviewRefinements_1.createStaticPreviewRefinements)({
800
+ const result = (0, staticPreviewRefinements_1.createStaticPreviewRefinements)({
792
801
  request: args,
793
802
  store: this.store,
794
803
  telemetry: this.telemetry,
795
804
  getStaticPreviewHtml: (sessionId, workItemId) => this.getStaticPreviewHtml(sessionId, workItemId),
796
805
  emitChange: () => this.emitChange(),
797
806
  });
807
+ const requestTimes = this.resources.get(args.sessionId)?.requestTimes;
808
+ requestTimes?.record(result.createdWorkItemIds, Date.now());
809
+ return result;
798
810
  }
799
811
  async adoptPastVariant(args) {
800
812
  const { assetBase, entryPath, hasAssets } = await (0, staticPreviewFiles_1.resolveStaticPreviewFiles)({
@@ -810,6 +822,7 @@ class AgentVariantsOrchestrator {
810
822
  references: args.references,
811
823
  previewRoutes: args.previewRoutes,
812
824
  runLabel: args.runLabel,
825
+ sourceDirectionRef: args.directionRef,
813
826
  });
814
827
  this.telemetry.trackAgentVariantsRequestStarted?.({
815
828
  sessionId: args.sessionId,
@@ -859,6 +872,7 @@ class AgentVariantsOrchestrator {
859
872
  references: args.references,
860
873
  previewRoutes: args.previewRoutes,
861
874
  runLabel: args.runLabel,
875
+ directionRef: args.directionRef,
862
876
  });
863
877
  return {
864
878
  sessionId: usableSessionId,
@@ -880,6 +894,7 @@ class AgentVariantsOrchestrator {
880
894
  references: args.references,
881
895
  previewRoutes: args.previewRoutes,
882
896
  runLabel: args.runLabel,
897
+ sourceDirectionRef: args.directionRef,
883
898
  projectContext: args.projectContext,
884
899
  });
885
900
  this.activeSessionId = created.sessionId;
@@ -1548,6 +1563,8 @@ class AgentVariantsOrchestrator {
1548
1563
  const durationMs = leasedAt !== undefined ? Date.now() - leasedAt : null;
1549
1564
  const approveStartedAt = resources?.approveStartedAt;
1550
1565
  const approveToCompleteMs = approveStartedAt !== undefined ? Date.now() - approveStartedAt : null;
1566
+ const requestTimes = resources?.requestTimes;
1567
+ const elapsedSinceRequestMs = (at) => requestTimes?.elapsedSinceRequestMs(args.workItemId, at) ?? null;
1551
1568
  const outputBytes = (0, variantWorkspaceFiles_1.estimateOutputBytes)(effectiveArgs.output);
1552
1569
  const projectContextKind = this.store.getProjectContext(args.sessionId).kind;
1553
1570
  const mode = workItemKind !== undefined && isImplementationWorkItemKind(workItemKind)
@@ -1563,6 +1580,8 @@ class AgentVariantsOrchestrator {
1563
1580
  attempt: args.attempt,
1564
1581
  durationMs,
1565
1582
  approveToCompleteMs,
1583
+ requestToCompleteMs: elapsedSinceRequestMs(Date.now()),
1584
+ queueWaitMs: elapsedSinceRequestMs(leasedAt),
1566
1585
  kind: workItemKind ?? null,
1567
1586
  mode,
1568
1587
  leaseToReportMs: leasedAt !== undefined ? reportReceivedAt - leasedAt : null,
@@ -2094,12 +2113,24 @@ class AgentVariantsOrchestrator {
2094
2113
  catch (err) {
2095
2114
  log.warn(`getDiff failed for ${record.worktreePath}`, err);
2096
2115
  }
2116
+ const staticEntryResolution = isFresh
2117
+ ? Promise.resolve(undefined)
2118
+ : (0, existingStaticEntry_1.resolveExistingStaticPreviewEntry)({
2119
+ sessionId,
2120
+ record,
2121
+ resolveEnv: this.resolveEnv,
2122
+ worktrees: this.worktrees,
2123
+ telemetry: this.telemetry,
2124
+ });
2097
2125
  if (!isFresh) {
2098
- this.trackHistoryPersist(this.persistCompletedExistingVariant({
2126
+ this.trackHistoryPersist(staticEntryResolution
2127
+ .then((staticEntry) => this.persistCompletedExistingVariant({
2099
2128
  sessionId,
2100
2129
  workItemId,
2101
2130
  diff: record.diff ?? '',
2102
- }).catch((err) => {
2131
+ staticEntry,
2132
+ }))
2133
+ .catch((err) => {
2103
2134
  log.warn(`persistCompletedExistingVariant failed for ${sessionId}/${workItemId}`, err);
2104
2135
  }));
2105
2136
  }
@@ -2111,12 +2142,11 @@ class AgentVariantsOrchestrator {
2111
2142
  log.warn(`persistCompletedArtifactVariant failed for ${sessionId}/${workItemId}`, err);
2112
2143
  }));
2113
2144
  }
2114
- if (!isFresh) {
2115
- const staticPreview = await this.registerExistingStaticPreview(sessionId, workItemId, record);
2116
- if (staticPreview !== 'not_static') {
2117
- this.emitChange();
2118
- return;
2119
- }
2145
+ const staticEntry = await staticEntryResolution;
2146
+ if (staticEntry) {
2147
+ await this.registerExistingStaticPreview(sessionId, workItemId, staticEntry);
2148
+ this.emitChange();
2149
+ return;
2120
2150
  }
2121
2151
  await this.previewRuntime.startVariant({
2122
2152
  sessionId,
@@ -2224,6 +2254,12 @@ class AgentVariantsOrchestrator {
2224
2254
  await Promise.allSettled([...this.pendingHistoryPersists]);
2225
2255
  }
2226
2256
  }
2257
+ loadDirectionRefs() {
2258
+ return this.store.directionRefs.load({
2259
+ projectPath: this.getProjectPath(),
2260
+ history: this.variantHistory,
2261
+ });
2262
+ }
2227
2263
  async getSavedVariant(args) {
2228
2264
  const saved = await this.variantHistory.getVariant(args);
2229
2265
  if (saved)
@@ -2297,16 +2333,9 @@ class AgentVariantsOrchestrator {
2297
2333
  return;
2298
2334
  }
2299
2335
  const record = this.workspaceInventory.getWorktree(args.sessionId, args.workItemId);
2300
- let sourceDir;
2301
- const staticEntryPath = env.framework === 'static' ? env.entryPath : undefined;
2302
- if (env.framework === 'static' && record) {
2303
- try {
2304
- sourceDir = await this.worktrees.getProjectCwdInWorktree(record.worktreePath);
2305
- }
2306
- catch (err) {
2307
- log.warn(`persistCompletedExistingVariant: static snapshot path failed for ${args.sessionId}/${args.workItemId}`, err);
2308
- }
2309
- }
2336
+ const staticSource = args.staticEntry?.kind === 'found' ? args.staticEntry : undefined;
2337
+ const sourceDir = staticSource?.projectDirectory;
2338
+ const staticEntryPath = staticSource?.entryPath;
2310
2339
  const input = this.store.requireVariantWorkItemInput({
2311
2340
  sessionId: args.sessionId,
2312
2341
  workItemId: args.workItemId,
@@ -2333,7 +2362,7 @@ class AgentVariantsOrchestrator {
2333
2362
  recipe: (0, variantWorkspaceFiles_1.buildServeRecipeFromResolved)(record.worktreePath, runningPreview.command, runningPreview.port),
2334
2363
  };
2335
2364
  }
2336
- else if (record) {
2365
+ else if (record && env.framework !== 'static') {
2337
2366
  try {
2338
2367
  const dev = await this.previewRuntime.resolveCommand(args.sessionId, record.worktreePath, RECIPE_PORT_SENTINEL, false);
2339
2368
  serve = {
@@ -2350,6 +2379,7 @@ class AgentVariantsOrchestrator {
2350
2379
  sessionId: args.sessionId,
2351
2380
  variantId: args.workItemId,
2352
2381
  ...(input.requestId ? { requestId: input.requestId } : {}),
2382
+ directionRef: this.store.claimDirectionRef(args),
2353
2383
  label: input.briefLabel,
2354
2384
  brief: input.briefBody,
2355
2385
  references: input.references,
@@ -2380,92 +2410,74 @@ class AgentVariantsOrchestrator {
2380
2410
  : {}),
2381
2411
  });
2382
2412
  }
2383
- async registerExistingStaticPreview(sessionId, workItemId, record) {
2384
- let env;
2385
- try {
2386
- env = await this.resolveEnv(sessionId);
2387
- }
2388
- catch (err) {
2389
- log.warn(`registerExistingStaticPreview: resolveEnv failed for ${sessionId}`, err);
2390
- return 'not_static';
2391
- }
2392
- if (env.framework !== 'static')
2393
- return 'not_static';
2394
- const previewStartedAt = Date.now();
2395
- (0, variantsTelemetry_1.trackPreviewStarted)(this.telemetry, {
2396
- sessionId,
2397
- variantId: workItemId,
2398
- projectContextKind: 'existing',
2399
- previewKind: 'static_artifact',
2400
- });
2413
+ async registerExistingStaticPreview(sessionId, workItemId, entry) {
2401
2414
  const resources = this.resources.get(sessionId);
2402
2415
  if (!resources)
2403
- return 'unavailable';
2416
+ return;
2404
2417
  const input = this.store.getVariantWorkItemInput(sessionId, workItemId);
2405
2418
  if (!input?.briefId)
2406
- return 'unavailable';
2407
- let projectCwd;
2408
- try {
2409
- projectCwd = await this.worktrees.getProjectCwdInWorktree(record.worktreePath);
2410
- }
2411
- catch (err) {
2412
- log.warn(`registerExistingStaticPreview: project cwd failed for ${sessionId}/${workItemId}`, err);
2413
- return 'unavailable';
2414
- }
2415
- const entryFile = path_1.default.join(projectCwd, env.entryPath);
2416
- try {
2417
- await fs_1.default.promises.access(entryFile, fs_1.default.constants.R_OK);
2418
- }
2419
- catch (err) {
2420
- log.warn(`registerExistingStaticPreview: no entry HTML at ${entryFile} for ${sessionId}/${workItemId}; preview unavailable`, err);
2421
- (0, variantsTelemetry_1.trackPreviewFailed)(this.telemetry, {
2422
- sessionId,
2423
- variantId: workItemId,
2424
- projectContextKind: 'existing',
2425
- previewKind: 'static_artifact',
2426
- errorCode: 'STATIC_PREVIEW_ENTRY_MISSING',
2427
- reason: 'missing_static_entry',
2428
- durationMs: Date.now() - previewStartedAt,
2429
- });
2430
- this.previewRuntime.setFailure(sessionId, workItemId, {
2431
- reason: 'missing_static_entry',
2432
- portInUse: false,
2433
- });
2434
- return 'unavailable';
2419
+ return;
2420
+ switch (entry.kind) {
2421
+ case 'unresolved':
2422
+ return;
2423
+ case 'missing':
2424
+ log.warn(`registerExistingStaticPreview: no entry page (${entry.source}) for ${sessionId}/${workItemId}; preview unavailable`);
2425
+ (0, variantsTelemetry_1.trackPreviewFailed)(this.telemetry, {
2426
+ sessionId,
2427
+ variantId: workItemId,
2428
+ projectContextKind: 'existing',
2429
+ previewKind: 'static_artifact',
2430
+ errorCode: 'STATIC_PREVIEW_ENTRY_MISSING',
2431
+ reason: 'missing_static_entry',
2432
+ durationMs: Date.now() - entry.startedAt,
2433
+ staticEntrySource: entry.source,
2434
+ });
2435
+ this.previewRuntime.setFailure(sessionId, workItemId, {
2436
+ reason: 'missing_static_entry',
2437
+ portInUse: false,
2438
+ detail: entry.detail,
2439
+ });
2440
+ return;
2441
+ case 'found':
2442
+ break;
2443
+ default: {
2444
+ const unhandled = entry;
2445
+ throw new Error(`Unhandled static entry ${JSON.stringify(unhandled)}`);
2446
+ }
2435
2447
  }
2436
2448
  let dir;
2437
2449
  try {
2438
- dir = fs_1.default.realpathSync(projectCwd);
2450
+ dir = fs_1.default.realpathSync(entry.projectDirectory);
2439
2451
  }
2440
2452
  catch {
2441
- dir = projectCwd;
2453
+ dir = entry.projectDirectory;
2442
2454
  }
2443
2455
  let siteFallbackBase;
2444
2456
  try {
2445
- const hostRealRoot = fs_1.default.realpathSync(env.projectPath);
2457
+ const hostRealRoot = fs_1.default.realpathSync(entry.hostProjectPath);
2446
2458
  if (hostRealRoot !== dir)
2447
- siteFallbackBase = path_1.default.join(hostRealRoot, path_1.default.dirname(env.entryPath));
2459
+ siteFallbackBase = path_1.default.join(hostRealRoot, path_1.default.dirname(entry.entryPath));
2448
2460
  }
2449
2461
  catch { }
2450
2462
  this.workspaceInventory.setStaticPreview(sessionId, {
2451
2463
  workItemId,
2452
2464
  briefId: input.briefId,
2453
- entryPath: path_1.default.basename(env.entryPath),
2454
- assetBase: path_1.default.dirname(path_1.default.join(dir, env.entryPath)),
2465
+ entryPath: path_1.default.basename(entry.entryPath),
2466
+ assetBase: path_1.default.dirname(path_1.default.join(dir, entry.entryPath)),
2455
2467
  hasAssets: true,
2456
2468
  ...(siteFallbackBase ? { assetFallbackBase: siteFallbackBase } : {}),
2457
2469
  });
2458
2470
  this.previewRuntime.clearFailure(sessionId, workItemId);
2459
- log.info(`Variant ${workItemId} served as a static preview (existing/static, no dev server; root ${projectCwd})`);
2471
+ log.info(`Variant ${workItemId} served as a static preview (existing/static, no dev server; root ${entry.projectDirectory})`);
2460
2472
  (0, variantsTelemetry_1.trackPreviewReady)(this.telemetry, {
2461
2473
  sessionId,
2462
2474
  variantId: workItemId,
2463
2475
  projectContextKind: 'existing',
2464
2476
  previewKind: 'static_artifact',
2465
2477
  hasPort: false,
2466
- durationMs: Date.now() - previewStartedAt,
2478
+ durationMs: Date.now() - entry.startedAt,
2479
+ staticEntrySource: entry.source,
2467
2480
  });
2468
- return 'registered';
2469
2481
  }
2470
2482
  async prepareArtifactBase(sessionId) {
2471
2483
  const { projectPath } = await this.resolveEnv(sessionId);
@@ -2478,7 +2490,7 @@ class AgentVariantsOrchestrator {
2478
2490
  async createArtifactDiff(args) {
2479
2491
  const base = await this.prepareArtifactBase(args.sessionId);
2480
2492
  const env = await this.resolveEnv(args.sessionId);
2481
- const entryPath = env.framework === 'static' ? env.entryPath : 'index.html';
2493
+ const entryPath = (env.framework === 'static' && env.entryPath) || 'index.html';
2482
2494
  const files = (0, staticPreviewFiles_1.prepareStaticPreviewProjectFiles)({
2483
2495
  sourceDir: args.sourceDir,
2484
2496
  entryPath,
@@ -2598,6 +2610,7 @@ class AgentVariantsOrchestrator {
2598
2610
  sessionId: args.sessionId,
2599
2611
  variantId: args.workItemId,
2600
2612
  ...(input.requestId ? { requestId: input.requestId } : {}),
2613
+ directionRef: this.store.claimDirectionRef(args),
2601
2614
  label: input.briefLabel,
2602
2615
  brief: input.briefBody ?? '',
2603
2616
  references: input.references,
@@ -2746,6 +2759,7 @@ class AgentVariantsOrchestrator {
2746
2759
  startedAt: Date.now(),
2747
2760
  nextRoundIndex: 0,
2748
2761
  rounds: new Map(),
2762
+ requestTimes: new WorkItemRequestTimes_1.WorkItemRequestTimes(),
2749
2763
  leasedAt: new Map(),
2750
2764
  qaResults: new Map(),
2751
2765
  qaRegenRetried: new Set(),