rivet-design 0.21.9 → 0.22.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 (225) hide show
  1. package/README.md +5 -1
  2. package/README.npm.md +5 -1
  3. package/bin/rivet.js +4 -0
  4. package/dist/agent-variants/PreviewRuntime.d.ts.map +1 -1
  5. package/dist/agent-variants/PreviewRuntime.js +3 -5
  6. package/dist/agent-variants/PreviewRuntime.js.map +1 -1
  7. package/dist/agent-variants/SessionStore.d.ts +21 -2
  8. package/dist/agent-variants/SessionStore.d.ts.map +1 -1
  9. package/dist/agent-variants/SessionStore.js +88 -71
  10. package/dist/agent-variants/SessionStore.js.map +1 -1
  11. package/dist/agent-variants/VariantWorkspaceManager.d.ts.map +1 -1
  12. package/dist/agent-variants/VariantWorkspaceManager.js +8 -14
  13. package/dist/agent-variants/VariantWorkspaceManager.js.map +1 -1
  14. package/dist/agent-variants/WorkspaceProvisioning.d.ts.map +1 -1
  15. package/dist/agent-variants/WorkspaceProvisioning.js +32 -21
  16. package/dist/agent-variants/WorkspaceProvisioning.js.map +1 -1
  17. package/dist/agent-variants/WorktreeOrchestrator.d.ts +7 -37
  18. package/dist/agent-variants/WorktreeOrchestrator.d.ts.map +1 -1
  19. package/dist/agent-variants/WorktreeOrchestrator.js +148 -103
  20. package/dist/agent-variants/WorktreeOrchestrator.js.map +1 -1
  21. package/dist/agent-variants/contextAssets.d.ts.map +1 -1
  22. package/dist/agent-variants/contextAssets.js +2 -8
  23. package/dist/agent-variants/contextAssets.js.map +1 -1
  24. package/dist/agent-variants/contracts.d.ts +103 -63
  25. package/dist/agent-variants/contracts.d.ts.map +1 -1
  26. package/dist/agent-variants/contracts.js.map +1 -1
  27. package/dist/agent-variants/staticPreviewFiles.d.ts +33 -0
  28. package/dist/agent-variants/staticPreviewFiles.d.ts.map +1 -0
  29. package/dist/agent-variants/staticPreviewFiles.js +109 -0
  30. package/dist/agent-variants/staticPreviewFiles.js.map +1 -0
  31. package/dist/agent-variants/staticPreviewRefinements.d.ts.map +1 -1
  32. package/dist/agent-variants/staticPreviewRefinements.js +3 -3
  33. package/dist/agent-variants/staticPreviewRefinements.js.map +1 -1
  34. package/dist/agent-variants/variantContext.d.ts.map +1 -1
  35. package/dist/agent-variants/variantContext.js +2 -8
  36. package/dist/agent-variants/variantContext.js.map +1 -1
  37. package/dist/agent-variants/variantWorkspaceFiles.d.ts +0 -1
  38. package/dist/agent-variants/variantWorkspaceFiles.d.ts.map +1 -1
  39. package/dist/agent-variants/variantWorkspaceFiles.js +5 -10
  40. package/dist/agent-variants/variantWorkspaceFiles.js.map +1 -1
  41. package/dist/agent-variants/workItemBriefing.d.ts.map +1 -1
  42. package/dist/agent-variants/workItemBriefing.js +4 -0
  43. package/dist/agent-variants/workItemBriefing.js.map +1 -1
  44. package/dist/agent-variants/workItemInput.d.ts +5950 -0
  45. package/dist/agent-variants/workItemInput.d.ts.map +1 -0
  46. package/dist/agent-variants/workItemInput.js +76 -0
  47. package/dist/agent-variants/workItemInput.js.map +1 -0
  48. package/dist/agent-variants/workItemPreviewRoutes.d.ts +23 -0
  49. package/dist/agent-variants/workItemPreviewRoutes.d.ts.map +1 -0
  50. package/dist/agent-variants/workItemPreviewRoutes.js +95 -0
  51. package/dist/agent-variants/workItemPreviewRoutes.js.map +1 -0
  52. package/dist/cli/handoff.d.ts +5 -0
  53. package/dist/cli/handoff.d.ts.map +1 -1
  54. package/dist/cli/handoff.js +13 -10
  55. package/dist/cli/handoff.js.map +1 -1
  56. package/dist/config/proxy.d.ts +3 -0
  57. package/dist/config/proxy.d.ts.map +1 -1
  58. package/dist/config/proxy.js +7 -5
  59. package/dist/config/proxy.js.map +1 -1
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +46 -7
  62. package/dist/index.js.map +1 -1
  63. package/dist/install/agentSkill.d.ts +16 -0
  64. package/dist/install/agentSkill.d.ts.map +1 -0
  65. package/dist/install/agentSkill.js +54 -0
  66. package/dist/install/agentSkill.js.map +1 -0
  67. package/dist/install/allowlists.d.ts +3 -1
  68. package/dist/install/allowlists.d.ts.map +1 -1
  69. package/dist/install/allowlists.js +89 -27
  70. package/dist/install/allowlists.js.map +1 -1
  71. package/dist/install/automaticCliUpdate.d.ts.map +1 -1
  72. package/dist/install/automaticCliUpdate.js +6 -11
  73. package/dist/install/automaticCliUpdate.js.map +1 -1
  74. package/dist/install/channelCli.d.ts.map +1 -1
  75. package/dist/install/channelCli.js +2 -37
  76. package/dist/install/channelCli.js.map +1 -1
  77. package/dist/install/channelManager.d.ts +2 -1
  78. package/dist/install/channelManager.d.ts.map +1 -1
  79. package/dist/install/channelManager.js +23 -20
  80. package/dist/install/channelManager.js.map +1 -1
  81. package/dist/install/codexSkill.d.ts +1 -8
  82. package/dist/install/codexSkill.d.ts.map +1 -1
  83. package/dist/install/codexSkill.js +9 -50
  84. package/dist/install/codexSkill.js.map +1 -1
  85. package/dist/install/cursorSkill.d.ts +6 -0
  86. package/dist/install/cursorSkill.d.ts.map +1 -0
  87. package/dist/install/cursorSkill.js +36 -0
  88. package/dist/install/cursorSkill.js.map +1 -0
  89. package/dist/install/globalBootstrap.d.ts +3 -2
  90. package/dist/install/globalBootstrap.d.ts.map +1 -1
  91. package/dist/install/globalBootstrap.js +9 -41
  92. package/dist/install/globalBootstrap.js.map +1 -1
  93. package/dist/install/harnesses.d.ts +27 -0
  94. package/dist/install/harnesses.d.ts.map +1 -1
  95. package/dist/install/harnesses.js +174 -76
  96. package/dist/install/harnesses.js.map +1 -1
  97. package/dist/library/importFiles.d.ts.map +1 -1
  98. package/dist/library/importFiles.js +3 -3
  99. package/dist/library/importFiles.js.map +1 -1
  100. package/dist/prototype-host.js +2 -1
  101. package/dist/prototype-host.js.map +1 -1
  102. package/dist/proxy-middleware/proxy-config.d.ts +10 -0
  103. package/dist/proxy-middleware/proxy-config.d.ts.map +1 -1
  104. package/dist/proxy-middleware/proxy-config.js +20 -29
  105. package/dist/proxy-middleware/proxy-config.js.map +1 -1
  106. package/dist/routes/agentVariants.d.ts +1 -5
  107. package/dist/routes/agentVariants.d.ts.map +1 -1
  108. package/dist/routes/agentVariants.js +42 -85
  109. package/dist/routes/agentVariants.js.map +1 -1
  110. package/dist/routes/library/staticPreview.d.ts.map +1 -1
  111. package/dist/routes/library/staticPreview.js +9 -7
  112. package/dist/routes/library/staticPreview.js.map +1 -1
  113. package/dist/routes/prototypeHost.d.ts.map +1 -1
  114. package/dist/routes/prototypeHost.js +3 -3
  115. package/dist/routes/prototypeHost.js.map +1 -1
  116. package/dist/routes/staticPreviewPolicy.d.ts +13 -0
  117. package/dist/routes/staticPreviewPolicy.d.ts.map +1 -0
  118. package/dist/routes/staticPreviewPolicy.js +61 -0
  119. package/dist/routes/staticPreviewPolicy.js.map +1 -0
  120. package/dist/routes/variantRequestSchema.d.ts +4 -4
  121. package/dist/services/AuthService.js +3 -3
  122. package/dist/services/AuthService.js.map +1 -1
  123. package/dist/services/BundleStore.d.ts.map +1 -1
  124. package/dist/services/BundleStore.js +4 -8
  125. package/dist/services/BundleStore.js.map +1 -1
  126. package/dist/services/DependencyPreparationService.d.ts.map +1 -1
  127. package/dist/services/DependencyPreparationService.js +4 -3
  128. package/dist/services/DependencyPreparationService.js.map +1 -1
  129. package/dist/services/OperatingSystemServices.d.ts +5 -0
  130. package/dist/services/OperatingSystemServices.d.ts.map +1 -1
  131. package/dist/services/OperatingSystemServices.js +9 -3
  132. package/dist/services/OperatingSystemServices.js.map +1 -1
  133. package/dist/services/ProjectImport.d.ts.map +1 -1
  134. package/dist/services/ProjectImport.js +2 -1
  135. package/dist/services/ProjectImport.js.map +1 -1
  136. package/dist/services/ProjectPackageManager.d.ts +0 -1
  137. package/dist/services/ProjectPackageManager.d.ts.map +1 -1
  138. package/dist/services/ProjectPackageManager.js +5 -12
  139. package/dist/services/ProjectPackageManager.js.map +1 -1
  140. package/dist/services/PrototypeBuildService.d.ts.map +1 -1
  141. package/dist/services/PrototypeBuildService.js +10 -6
  142. package/dist/services/PrototypeBuildService.js.map +1 -1
  143. package/dist/services/VariantHistoryService.d.ts +3 -0
  144. package/dist/services/VariantHistoryService.d.ts.map +1 -1
  145. package/dist/services/VariantHistoryService.js +36 -12
  146. package/dist/services/VariantHistoryService.js.map +1 -1
  147. package/dist/services/WorktreeManager.d.ts.map +1 -1
  148. package/dist/services/WorktreeManager.js +4 -4
  149. package/dist/services/WorktreeManager.js.map +1 -1
  150. package/dist/services/packageManagerProcess.d.ts +20 -0
  151. package/dist/services/packageManagerProcess.d.ts.map +1 -0
  152. package/dist/services/packageManagerProcess.js +55 -0
  153. package/dist/services/packageManagerProcess.js.map +1 -0
  154. package/dist/services/referenceImages.d.ts.map +1 -1
  155. package/dist/services/referenceImages.js +4 -4
  156. package/dist/services/referenceImages.js.map +1 -1
  157. package/dist/services/staticProjectTarget.d.ts.map +1 -1
  158. package/dist/services/staticProjectTarget.js +3 -5
  159. package/dist/services/staticProjectTarget.js.map +1 -1
  160. package/dist/storage/library/ProjectPreviewCache.d.ts +2 -2
  161. package/dist/types/preview-routes.d.ts +6 -0
  162. package/dist/types/preview-routes.d.ts.map +1 -0
  163. package/dist/types/preview-routes.js +35 -0
  164. package/dist/types/preview-routes.js.map +1 -0
  165. package/dist/types/variant-history.d.ts +6 -0
  166. package/dist/types/variant-history.d.ts.map +1 -1
  167. package/dist/utils/pathContainment.d.ts +15 -0
  168. package/dist/utils/pathContainment.d.ts.map +1 -0
  169. package/dist/utils/pathContainment.js +46 -0
  170. package/dist/utils/pathContainment.js.map +1 -0
  171. package/dist/utils/skillWriter.d.ts +5 -2
  172. package/dist/utils/skillWriter.d.ts.map +1 -1
  173. package/dist/utils/skillWriter.js +93 -34
  174. package/dist/utils/skillWriter.js.map +1 -1
  175. package/dist/utils/staticPreviewPage.d.ts +11 -0
  176. package/dist/utils/staticPreviewPage.d.ts.map +1 -0
  177. package/dist/utils/staticPreviewPage.js +40 -0
  178. package/dist/utils/staticPreviewPage.js.map +1 -0
  179. package/package.json +6 -2
  180. package/src/ui/dist/assets/{LibraryEntry-BaphzdNv.js → LibraryEntry-CjxmVfhv.js} +8 -8
  181. package/src/ui/dist/assets/main-CdSzrhWD.js +435 -0
  182. package/src/ui/dist/assets/main-DVb3ws41.css +1 -0
  183. package/src/ui/dist/index.html +2 -2
  184. package/dist/agent-variants/elementRefToTarget.d.ts +0 -4
  185. package/dist/agent-variants/elementRefToTarget.d.ts.map +0 -1
  186. package/dist/agent-variants/elementRefToTarget.js +0 -30
  187. package/dist/agent-variants/elementRefToTarget.js.map +0 -1
  188. package/dist/prompts/commentVariationPromptConfig.d.ts +0 -7
  189. package/dist/prompts/commentVariationPromptConfig.d.ts.map +0 -1
  190. package/dist/prompts/commentVariationPromptConfig.js +0 -12
  191. package/dist/prompts/commentVariationPromptConfig.js.map +0 -1
  192. package/dist/prompts/commentVariationPromptSnapshot.d.ts +0 -3
  193. package/dist/prompts/commentVariationPromptSnapshot.d.ts.map +0 -1
  194. package/dist/prompts/commentVariationPromptSnapshot.js +0 -31
  195. package/dist/prompts/commentVariationPromptSnapshot.js.map +0 -1
  196. package/dist/prompts/commentVariationPrompts.d.ts +0 -7
  197. package/dist/prompts/commentVariationPrompts.d.ts.map +0 -1
  198. package/dist/prompts/commentVariationPrompts.js +0 -54
  199. package/dist/prompts/commentVariationPrompts.js.map +0 -1
  200. package/dist/services/adapters/TailwindTokenAdapter.d.ts +0 -17
  201. package/dist/services/adapters/TailwindTokenAdapter.d.ts.map +0 -1
  202. package/dist/services/adapters/TailwindTokenAdapter.js +0 -284
  203. package/dist/services/adapters/TailwindTokenAdapter.js.map +0 -1
  204. package/dist/services/extractors/CSSVariableExtractor.d.ts +0 -10
  205. package/dist/services/extractors/CSSVariableExtractor.d.ts.map +0 -1
  206. package/dist/services/extractors/CSSVariableExtractor.js +0 -110
  207. package/dist/services/extractors/CSSVariableExtractor.js.map +0 -1
  208. package/dist/services/staticStarter.d.ts +0 -3
  209. package/dist/services/staticStarter.d.ts.map +0 -1
  210. package/dist/services/staticStarter.js +0 -129
  211. package/dist/services/staticStarter.js.map +0 -1
  212. package/dist/utils/elementFileHintSignals.d.ts +0 -3
  213. package/dist/utils/elementFileHintSignals.d.ts.map +0 -1
  214. package/dist/utils/elementFileHintSignals.js +0 -35
  215. package/dist/utils/elementFileHintSignals.js.map +0 -1
  216. package/dist/utils/formatElementTargetingContext.d.ts +0 -28
  217. package/dist/utils/formatElementTargetingContext.d.ts.map +0 -1
  218. package/dist/utils/formatElementTargetingContext.js +0 -82
  219. package/dist/utils/formatElementTargetingContext.js.map +0 -1
  220. package/dist/utils/variantPreviewPort.d.ts +0 -15
  221. package/dist/utils/variantPreviewPort.d.ts.map +0 -1
  222. package/dist/utils/variantPreviewPort.js +0 -25
  223. package/dist/utils/variantPreviewPort.js.map +0 -1
  224. package/src/ui/dist/assets/main-CVCXVenP.js +0 -435
  225. package/src/ui/dist/assets/main-vcYlLdli.css +0 -1
@@ -5,11 +5,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.AgentVariantsOrchestrator = exports.buildStaticPreviewDocument = void 0;
7
7
  const workItemContextFiles_1 = require("./workItemContextFiles");
8
+ const staticPreviewFiles_1 = require("./staticPreviewFiles");
9
+ const workItemPreviewRoutes_1 = require("./workItemPreviewRoutes");
8
10
  const staticPreviewRefinements_1 = require("./staticPreviewRefinements");
9
11
  const crypto_1 = require("crypto");
10
12
  const events_1 = require("events");
11
13
  const fs_1 = __importDefault(require("fs"));
12
- const os_1 = __importDefault(require("os"));
13
14
  const path_1 = __importDefault(require("path"));
14
15
  const DependencyPreparationService_1 = require("../services/DependencyPreparationService");
15
16
  const simple_git_1 = require("simple-git");
@@ -33,6 +34,7 @@ const variantsTelemetry_1 = require("./variantsTelemetry");
33
34
  const variantWorkspaceFiles_1 = require("./variantWorkspaceFiles");
34
35
  const errnoCode_1 = require("../utils/errnoCode");
35
36
  const errorMessage_1 = require("../utils/errorMessage");
37
+ const pathContainment_1 = require("../utils/pathContainment");
36
38
  var variantWorkspaceFiles_2 = require("./variantWorkspaceFiles");
37
39
  Object.defineProperty(exports, "buildStaticPreviewDocument", { enumerable: true, get: function () { return variantWorkspaceFiles_2.buildStaticPreviewDocument; } });
38
40
  const log = (0, logger_1.createLogger)('AgentVariantsOrchestrator');
@@ -184,8 +186,7 @@ const buildDiffCaptureFailureQa = (detail, message) => ({
184
186
  summary: DIFF_CAPTURE_FAILURE_SUMMARY,
185
187
  });
186
188
  const isDesignCreationCodeGenInput = (input, prompt) => {
187
- const codeGenInput = input;
188
- const text = [prompt, codeGenInput?.briefLabel, codeGenInput?.briefBody]
189
+ const text = [prompt, input?.briefLabel, input?.briefBody]
189
190
  .filter((value) => typeof value === 'string')
190
191
  .join('\n');
191
192
  if (NON_VISUAL_CHANGE_RE.test(text))
@@ -410,6 +411,7 @@ class AgentVariantsOrchestrator {
410
411
  this.emitChange();
411
412
  }
412
413
  getHostWork(sessionId) {
414
+ const projectContext = this.store.getProjectContext(sessionId);
413
415
  return this.store.getHostWork(sessionId).map((item) => {
414
416
  const kind = item.kind;
415
417
  if (!isImplementationWorkItemKind(kind)) {
@@ -419,7 +421,11 @@ class AgentVariantsOrchestrator {
419
421
  };
420
422
  return planningItem;
421
423
  }
422
- const input = (item.input ?? {});
424
+ const input = this.store.requireVariantWorkItemInput({
425
+ sessionId,
426
+ workItemId: item.workId,
427
+ kinds: [kind],
428
+ });
423
429
  const workspace = this.workspaceInventory.requireAssignedWorkspace(sessionId, item.workId, kind);
424
430
  const contextAssets = this.workspaceInventory.getContextAssets(sessionId, item.workId);
425
431
  const mode = input.sourceVariantId
@@ -430,6 +436,7 @@ class AgentVariantsOrchestrator {
430
436
  (mode === 'refine' ? input.briefBody : undefined) ??
431
437
  sourceLabel;
432
438
  const implementationItem = {
439
+ ...(input.previewRoutes ? { previewRoutes: input.previewRoutes } : {}),
433
440
  workId: item.workId,
434
441
  guidance: input.guidance ?? [],
435
442
  variantId: item.variantId,
@@ -466,6 +473,11 @@ class AgentVariantsOrchestrator {
466
473
  ? { kind: 'worktree_diff' }
467
474
  : { kind: 'static_artifact' },
468
475
  };
476
+ if (kind === 'code_gen' && projectContext.kind === 'existing')
477
+ implementationItem.previewRoutesPath = (0, workItemPreviewRoutes_1.prepareWorkItemPreviewRoutes)({
478
+ ...item,
479
+ sessionId,
480
+ });
469
481
  return implementationItem;
470
482
  });
471
483
  }
@@ -632,7 +644,7 @@ class AgentVariantsOrchestrator {
632
644
  return 'completed';
633
645
  }
634
646
  refinementTelemetryForWorkItem(args) {
635
- const input = this.store.getWorkItemInput(args.sessionId, args.workItemId);
647
+ const input = this.store.getVariantWorkItemInput(args.sessionId, args.workItemId);
636
648
  const targetVariantId = input?.variantId ?? input?.sourceVariantId;
637
649
  if (!targetVariantId)
638
650
  return null;
@@ -854,13 +866,18 @@ class AgentVariantsOrchestrator {
854
866
  });
855
867
  }
856
868
  async adoptPastVariant(args) {
857
- const { assetBase, hasAssets } = await this.resolveAdoptedStaticPreviewFiles(args.filesDir, args.entryPath);
869
+ const { assetBase, entryPath, hasAssets } = await (0, staticPreviewFiles_1.resolveStaticPreviewFiles)({
870
+ filesDir: args.filesDir,
871
+ entryPath: args.entryPath,
872
+ isWebsite: Boolean(args.previewRoutes?.length),
873
+ });
858
874
  const append = this.store.appendAdoptedStaticVariant({
859
875
  sessionId: args.sessionId,
860
876
  source: args.source,
861
877
  label: args.label,
862
878
  description: args.description,
863
879
  references: args.references,
880
+ previewRoutes: args.previewRoutes,
864
881
  runLabel: args.runLabel,
865
882
  });
866
883
  this.telemetry.trackAgentVariantsRequestStarted?.({
@@ -875,7 +892,7 @@ class AgentVariantsOrchestrator {
875
892
  this.workspaceInventory.setStaticPreview(args.sessionId, {
876
893
  workItemId: append.workItemId,
877
894
  briefId: append.briefId,
878
- entryPath: args.entryPath,
895
+ entryPath,
879
896
  assetBase,
880
897
  hasAssets,
881
898
  });
@@ -909,6 +926,7 @@ class AgentVariantsOrchestrator {
909
926
  label: args.label,
910
927
  description: args.description,
911
928
  references: args.references,
929
+ previewRoutes: args.previewRoutes,
912
930
  runLabel: args.runLabel,
913
931
  });
914
932
  return {
@@ -918,7 +936,11 @@ class AgentVariantsOrchestrator {
918
936
  bootstrapped: false,
919
937
  };
920
938
  }
921
- const { assetBase, hasAssets } = await this.resolveAdoptedStaticPreviewFiles(args.filesDir, args.entryPath);
939
+ const { assetBase, entryPath, hasAssets } = await (0, staticPreviewFiles_1.resolveStaticPreviewFiles)({
940
+ filesDir: args.filesDir,
941
+ entryPath: args.entryPath,
942
+ isWebsite: Boolean(args.previewRoutes?.length),
943
+ });
922
944
  void this.previewRuntime.stopLingeringCommitted().catch((err) => {
923
945
  log.warn('Stopping lingering committed dev servers failed', err);
924
946
  });
@@ -928,6 +950,7 @@ class AgentVariantsOrchestrator {
928
950
  label: args.label,
929
951
  description: args.description,
930
952
  references: args.references,
953
+ previewRoutes: args.previewRoutes,
931
954
  runLabel: args.runLabel,
932
955
  projectContext: args.projectContext,
933
956
  });
@@ -936,7 +959,7 @@ class AgentVariantsOrchestrator {
936
959
  this.workspaceInventory.setStaticPreview(created.sessionId, {
937
960
  workItemId: created.workItemId,
938
961
  briefId: created.briefId,
939
- entryPath: args.entryPath,
962
+ entryPath,
940
963
  assetBase,
941
964
  hasAssets,
942
965
  });
@@ -959,30 +982,6 @@ class AgentVariantsOrchestrator {
959
982
  const stage = this.store.getStage(sessionId);
960
983
  return stage === 'failed' || stage === 'cancelled' ? null : sessionId;
961
984
  }
962
- async resolveAdoptedStaticPreviewFiles(filesDir, entryPath) {
963
- const entryFile = path_1.default.join(filesDir, entryPath);
964
- try {
965
- await fs_1.default.promises.access(entryFile, fs_1.default.constants.R_OK);
966
- }
967
- catch {
968
- throw new errors_1.AgentVariantsError('RUNTIME_VALIDATION_FAILED', `Cannot adopt past variant: no readable ${entryPath} under ${filesDir}`);
969
- }
970
- let assetBase;
971
- try {
972
- assetBase = fs_1.default.realpathSync(filesDir);
973
- }
974
- catch {
975
- assetBase = filesDir;
976
- }
977
- let hasAssets = false;
978
- try {
979
- hasAssets = fs_1.default.readdirSync(assetBase).some((name) => name !== entryPath);
980
- }
981
- catch {
982
- hasAssets = false;
983
- }
984
- return { assetBase, hasAssets };
985
- }
986
985
  isStaticPreviewVariant(sessionId, workItemId) {
987
986
  try {
988
987
  return (this.store.getWorkItemKind(sessionId, workItemId) === 'static_preview');
@@ -995,7 +994,7 @@ class AgentVariantsOrchestrator {
995
994
  if (!sourceVariantId)
996
995
  return undefined;
997
996
  try {
998
- const sourceInput = this.store.getWorkItemInput(sessionId, sourceVariantId);
997
+ const sourceInput = this.store.getVariantWorkItemInput(sessionId, sourceVariantId);
999
998
  return (sourceInput?.adoptedFrom ?? { sessionId, variantId: sourceVariantId });
1000
999
  }
1001
1000
  catch {
@@ -1067,8 +1066,8 @@ class AgentVariantsOrchestrator {
1067
1066
  getStage(sessionId) {
1068
1067
  return this.store.getStage(sessionId);
1069
1068
  }
1070
- getWorkItemInput(sessionId, workItemId) {
1071
- return this.store.getWorkItemInput(sessionId, workItemId);
1069
+ getVariantWorkItemInput(sessionId, workItemId) {
1070
+ return this.store.getVariantWorkItemInput(sessionId, workItemId);
1072
1071
  }
1073
1072
  getWorkItemStatus(sessionId, workItemId) {
1074
1073
  return this.store.getWorkItemStatus(sessionId, workItemId);
@@ -1245,11 +1244,15 @@ class AgentVariantsOrchestrator {
1245
1244
  const record = this.workspaceInventory.getStaticPreview(sessionId, workItemId);
1246
1245
  if (!record?.assetBase)
1247
1246
  return undefined;
1248
- if (!requestedPath || requestedPath.length === 0)
1247
+ const requested = requestedPath ?? record.entryPath;
1248
+ if (!requested)
1249
1249
  return undefined;
1250
- return ((0, variantWorkspaceFiles_1.resolveAssetWithinBase)(record.assetBase, requestedPath) ??
1250
+ const assetPath = requested.endsWith('/')
1251
+ ? requested + 'index.html'
1252
+ : requested;
1253
+ return ((0, variantWorkspaceFiles_1.resolveAssetWithinBase)(record.assetBase, assetPath) ??
1251
1254
  (record.assetFallbackBase
1252
- ? (0, variantWorkspaceFiles_1.resolveAssetWithinBase)(record.assetFallbackBase, requestedPath)
1255
+ ? (0, variantWorkspaceFiles_1.resolveAssetWithinBase)(record.assetFallbackBase, assetPath)
1253
1256
  : undefined));
1254
1257
  }
1255
1258
  getStaticPreviewByBriefId(sessionId, briefId) {
@@ -1425,6 +1428,12 @@ class AgentVariantsOrchestrator {
1425
1428
  if (args.requestId) {
1426
1429
  this.store.assignVariantRequestId(sessionId, variantIds, args.requestId);
1427
1430
  }
1431
+ this.store.assignVariantPreviewRoutes({
1432
+ sessionId,
1433
+ workItemIds: variantIds,
1434
+ previewRoutes: args.previewRoutes,
1435
+ sourceVariantId: args.sourceVariantId,
1436
+ });
1428
1437
  if (args.sourceVariantId) {
1429
1438
  this.telemetry.trackAgentVariantsRefinementRequested?.({
1430
1439
  sessionId,
@@ -1561,7 +1570,7 @@ class AgentVariantsOrchestrator {
1561
1570
  if (telemetry) {
1562
1571
  this.telemetry.trackAgentVariantsRefinementFailed?.(telemetry);
1563
1572
  }
1564
- throw new errors_1.AgentVariantsError('SCHEMA_VALIDATION_FAILED', `${workItemKind} output.html must be a string and non-empty when explicit output is provided. Host workers should write the assigned index.html instead.`);
1573
+ throw new errors_1.AgentVariantsError('SCHEMA_VALIDATION_FAILED', `${workItemKind} output.html must be a string and non-empty when explicit output is provided. Host workers should write the assigned entry file instead.`);
1565
1574
  }
1566
1575
  const qaStartedAt = Date.now();
1567
1576
  const qaEval = workItemKind === 'refine_variant'
@@ -1572,6 +1581,16 @@ class AgentVariantsOrchestrator {
1572
1581
  return this.handleQaRegenRetry(resolvedArgs, qaEval.qa);
1573
1582
  }
1574
1583
  let effectiveArgs = qaEval?.decision === 'fail_terminal' ? qaEval.overrideArgs : resolvedArgs;
1584
+ if (effectiveArgs.status === 'succeeded' && workItemKind === 'code_gen') {
1585
+ effectiveArgs = {
1586
+ ...effectiveArgs,
1587
+ ...(await (0, workItemPreviewRoutes_1.recordWorkItemPreviewRoutes)({
1588
+ store: this.store,
1589
+ ...args,
1590
+ workId: args.workItemId,
1591
+ })),
1592
+ };
1593
+ }
1575
1594
  if (workItemKind === 'refine_variant' &&
1576
1595
  effectiveArgs.status === 'succeeded') {
1577
1596
  try {
@@ -1949,7 +1968,11 @@ class AgentVariantsOrchestrator {
1949
1968
  'Variant is not committable');
1950
1969
  }
1951
1970
  await this.settleHistoryPersists();
1952
- const input = this.store.getWorkItemInput(args.sessionId, args.variantId);
1971
+ const input = this.store.requireVariantWorkItemInput({
1972
+ sessionId: args.sessionId,
1973
+ workItemId: args.variantId,
1974
+ kinds: ['code_gen', 'static_preview'],
1975
+ });
1953
1976
  const projectContext = this.store.getProjectContext(args.sessionId);
1954
1977
  if (projectContext.kind === 'fresh') {
1955
1978
  await this.persistCompletedFreshVariantsForCommit(args.sessionId);
@@ -1981,7 +2004,8 @@ class AgentVariantsOrchestrator {
1981
2004
  if (!anyAssetBaseIsDestination) {
1982
2005
  const allowed = new Set();
1983
2006
  for (const sp of this.workspaceInventory.getStaticPreviews(args.sessionId)) {
1984
- if (sp.assetBase && (0, variantWorkspaceFiles_1.isStrictlyInside)(sp.assetBase, compareBase)) {
2007
+ if (sp.assetBase &&
2008
+ (0, pathContainment_1.isPathStrictlyInsideRoot)(compareBase, sp.assetBase)) {
1985
2009
  allowed.add(path_1.default.basename(sp.assetBase));
1986
2010
  }
1987
2011
  }
@@ -2077,7 +2101,7 @@ class AgentVariantsOrchestrator {
2077
2101
  }
2078
2102
  const chosenAssetBase = staticPreview?.assetBase;
2079
2103
  if (chosenAssetBase &&
2080
- (0, variantWorkspaceFiles_1.isStrictlyInside)(chosenAssetBase, flattenBase)) {
2104
+ (0, pathContainment_1.isPathStrictlyInsideRoot)(flattenBase, chosenAssetBase)) {
2081
2105
  for (const entry of fs_1.default.readdirSync(chosenAssetBase)) {
2082
2106
  const src = path_1.default.join(chosenAssetBase, entry);
2083
2107
  const dst = path_1.default.join(flattenBase, entry);
@@ -2103,7 +2127,7 @@ class AgentVariantsOrchestrator {
2103
2127
  if (other.workItemId === args.variantId)
2104
2128
  continue;
2105
2129
  if (other.assetBase &&
2106
- (0, variantWorkspaceFiles_1.isStrictlyInside)(other.assetBase, flattenBase)) {
2130
+ (0, pathContainment_1.isPathStrictlyInsideRoot)(flattenBase, other.assetBase)) {
2107
2131
  fs_1.default.rmSync(other.assetBase, { recursive: true, force: true });
2108
2132
  }
2109
2133
  }
@@ -2296,7 +2320,11 @@ class AgentVariantsOrchestrator {
2296
2320
  return { decision: 'pass', qa: passedBase };
2297
2321
  }
2298
2322
  async evaluateExistingCodeGenQa(args) {
2299
- const input = this.store.getWorkItemInput(args.sessionId, args.workItemId);
2323
+ const input = this.store.requireVariantWorkItemInput({
2324
+ sessionId: args.sessionId,
2325
+ workItemId: args.workItemId,
2326
+ kinds: ['code_gen'],
2327
+ });
2300
2328
  if (!isDesignCreationCodeGenInput(input, this.store.getPrompt(args.sessionId))) {
2301
2329
  return null;
2302
2330
  }
@@ -2426,8 +2454,8 @@ class AgentVariantsOrchestrator {
2426
2454
  if (resources && !record) {
2427
2455
  const staticPreview = (0, variantWorkspaceFiles_1.parseStaticPreviewOutput)((0, variantWorkspaceFiles_1.normalizeOutput)(args.output));
2428
2456
  if (staticPreview) {
2429
- const input = this.store.getWorkItemInput(sessionId, workItemId);
2430
- if (input.briefId) {
2457
+ const input = this.store.getVariantWorkItemInput(sessionId, workItemId);
2458
+ if (input?.briefId) {
2431
2459
  const projectContext = this.store.getProjectContext(sessionId);
2432
2460
  const previewStartedAt = Date.now();
2433
2461
  (0, variantsTelemetry_1.trackPreviewStarted)(this.telemetry, {
@@ -2465,21 +2493,27 @@ class AgentVariantsOrchestrator {
2465
2493
  });
2466
2494
  return;
2467
2495
  }
2496
+ let entryPath = 'index.html';
2468
2497
  try {
2469
2498
  fs_1.default.mkdirSync(dir, { recursive: true });
2470
2499
  try {
2471
2500
  dir = fs_1.default.realpathSync(dir);
2472
2501
  }
2473
2502
  catch { }
2474
- fs_1.default.writeFileSync(path_1.default.join(dir, 'index.html'), staticPreview.html, 'utf8');
2503
+ entryPath = (0, staticPreviewFiles_1.writeStaticPreviewPage)({
2504
+ assetBase: dir,
2505
+ html: staticPreview.html,
2506
+ previewRoutes: input.previewRoutes,
2507
+ source: this.workspaceInventory.getStaticPreview(sessionId, input.sourceVariantId ?? workItemId),
2508
+ });
2475
2509
  }
2476
2510
  catch (err) {
2477
- log.warn(`failed to materialize static preview index.html for ${workItemId}`, err);
2511
+ log.warn(`failed to materialize the static preview page for ${workItemId}`, err);
2478
2512
  }
2479
2513
  const record = {
2480
2514
  workItemId,
2481
2515
  briefId: input.briefId,
2482
- entryPath: 'index.html',
2516
+ entryPath,
2483
2517
  assetBase: dir,
2484
2518
  hasAssets: Boolean(resolvedAssetBase || assignedArtifactBase),
2485
2519
  };
@@ -2568,7 +2602,11 @@ class AgentVariantsOrchestrator {
2568
2602
  if (!resources) {
2569
2603
  throw new errors_1.AgentVariantsError('SESSION_NOT_FOUND', `No live resources for session ${args.sessionId}`);
2570
2604
  }
2571
- const input = this.store.getWorkItemInput(args.sessionId, args.workItemId);
2605
+ const input = this.store.requireVariantWorkItemInput({
2606
+ sessionId: args.sessionId,
2607
+ workItemId: args.workItemId,
2608
+ kinds: ['refine_variant'],
2609
+ });
2572
2610
  if (!input.variantId) {
2573
2611
  throw new errors_1.AgentVariantsError('MISSING_REQUIRED_INPUT', 'refine_variant work item is missing variantId');
2574
2612
  }
@@ -2576,7 +2614,11 @@ class AgentVariantsOrchestrator {
2576
2614
  if (!parsed) {
2577
2615
  throw new errors_1.AgentVariantsError('SCHEMA_VALIDATION_FAILED', 'refine_variant report_variant_complete requires output.html');
2578
2616
  }
2579
- const targetInput = this.store.getWorkItemInput(args.sessionId, input.variantId);
2617
+ const targetInput = this.store.requireVariantWorkItemInput({
2618
+ sessionId: args.sessionId,
2619
+ workItemId: input.variantId,
2620
+ kinds: ['static_preview'],
2621
+ });
2580
2622
  if (!targetInput.briefId) {
2581
2623
  throw new errors_1.AgentVariantsError('VARIANT_NOT_EDITABLE', 'Target static_preview variant is missing briefId');
2582
2624
  }
@@ -2590,10 +2632,15 @@ class AgentVariantsOrchestrator {
2590
2632
  ? refinementWorkspace.rootPath
2591
2633
  : undefined;
2592
2634
  const dir = resolvedAssetBase ?? assignedArtifactBase ?? previousRecord?.assetBase;
2635
+ let entryPath = 'index.html';
2593
2636
  if (dir) {
2594
2637
  try {
2595
- fs_1.default.mkdirSync(dir, { recursive: true });
2596
- fs_1.default.writeFileSync(path_1.default.join(dir, 'index.html'), parsed.html, 'utf8');
2638
+ entryPath = (0, staticPreviewFiles_1.writeStaticPreviewPage)({
2639
+ assetBase: dir,
2640
+ html: parsed.html,
2641
+ source: previousRecord,
2642
+ previewRoutes: targetInput.previewRoutes,
2643
+ });
2597
2644
  }
2598
2645
  catch (err) {
2599
2646
  throw new errors_1.AgentVariantsError('RUNTIME_VALIDATION_FAILED', `Failed to materialize refined static preview for ${input.variantId}: ${(0, errorMessage_1.errorMessage)(err)}`);
@@ -2607,7 +2654,7 @@ class AgentVariantsOrchestrator {
2607
2654
  this.workspaceInventory.setStaticPreview(args.sessionId, {
2608
2655
  workItemId: input.variantId,
2609
2656
  briefId: targetInput.briefId,
2610
- entryPath: 'index.html',
2657
+ entryPath,
2611
2658
  assetBase: dir,
2612
2659
  hasAssets: Boolean(resolvedAssetBase) ||
2613
2660
  Boolean(assignedArtifactBase) ||
@@ -2732,7 +2779,11 @@ class AgentVariantsOrchestrator {
2732
2779
  log.warn(`persistCompletedExistingVariant: static snapshot path failed for ${args.sessionId}/${args.workItemId}`, err);
2733
2780
  }
2734
2781
  }
2735
- const input = this.store.getWorkItemInput(args.sessionId, args.workItemId);
2782
+ const input = this.store.requireVariantWorkItemInput({
2783
+ sessionId: args.sessionId,
2784
+ workItemId: args.workItemId,
2785
+ kinds: ['code_gen'],
2786
+ });
2736
2787
  const sessionPrompt = this.store.getPrompt(args.sessionId);
2737
2788
  const snapshotDir = record?.worktreePath;
2738
2789
  let baseDir;
@@ -2775,6 +2826,7 @@ class AgentVariantsOrchestrator {
2775
2826
  brief: input.briefBody,
2776
2827
  references: input.references,
2777
2828
  referenceContext: input.context,
2829
+ previewRoutes: input.previewRoutes,
2778
2830
  referenceContextRoots: [
2779
2831
  path_1.default.join(this.variantHistory.store.storage.resolve(env.projectPath)
2780
2832
  .dataDirectory, 'variant-context'),
@@ -2821,8 +2873,8 @@ class AgentVariantsOrchestrator {
2821
2873
  const resources = this.resources.get(sessionId);
2822
2874
  if (!resources)
2823
2875
  return 'unavailable';
2824
- const input = this.store.getWorkItemInput(sessionId, workItemId);
2825
- if (!input.briefId)
2876
+ const input = this.store.getVariantWorkItemInput(sessionId, workItemId);
2877
+ if (!input?.briefId)
2826
2878
  return 'unavailable';
2827
2879
  let projectCwd;
2828
2880
  try {
@@ -2860,20 +2912,20 @@ class AgentVariantsOrchestrator {
2860
2912
  catch {
2861
2913
  dir = projectCwd;
2862
2914
  }
2863
- let assetFallbackBase;
2915
+ let siteFallbackBase;
2864
2916
  try {
2865
2917
  const hostRealRoot = fs_1.default.realpathSync(env.projectPath);
2866
2918
  if (hostRealRoot !== dir)
2867
- assetFallbackBase = hostRealRoot;
2919
+ siteFallbackBase = path_1.default.join(hostRealRoot, path_1.default.dirname(env.entryPath));
2868
2920
  }
2869
2921
  catch { }
2870
2922
  this.workspaceInventory.setStaticPreview(sessionId, {
2871
2923
  workItemId,
2872
2924
  briefId: input.briefId,
2873
- entryPath: env.entryPath,
2874
- assetBase: dir,
2925
+ entryPath: path_1.default.basename(env.entryPath),
2926
+ assetBase: path_1.default.dirname(path_1.default.join(dir, env.entryPath)),
2875
2927
  hasAssets: true,
2876
- ...(assetFallbackBase ? { assetFallbackBase } : {}),
2928
+ ...(siteFallbackBase ? { assetFallbackBase: siteFallbackBase } : {}),
2877
2929
  });
2878
2930
  this.previewRuntime.clearFailure(sessionId, workItemId);
2879
2931
  log.info(`Variant ${workItemId} served as a static preview (existing/static, no dev server; root ${projectCwd})`);
@@ -2899,15 +2951,11 @@ class AgentVariantsOrchestrator {
2899
2951
  const base = await this.prepareArtifactBase(args.sessionId);
2900
2952
  const env = await this.resolveEnv(args.sessionId);
2901
2953
  const entryPath = env.framework === 'static' ? env.entryPath : 'index.html';
2902
- const entryFile = path_1.default.resolve(args.sourceDir, entryPath);
2903
- if (!(0, variantWorkspaceFiles_1.isStrictlyInside)(entryFile, args.sourceDir)) {
2904
- throw new errors_1.AgentVariantsError('RUNTIME_VALIDATION_FAILED', 'Artifact entry must be inside its project directory.');
2905
- }
2906
- const isEntryMapped = entryFile !== path_1.default.join(args.sourceDir, 'index.html');
2907
- if (isEntryMapped) {
2908
- fs_1.default.mkdirSync(path_1.default.dirname(entryFile), { recursive: true });
2909
- fs_1.default.copyFileSync(path_1.default.join(args.sourceDir, 'index.html'), entryFile);
2910
- }
2954
+ const files = (0, staticPreviewFiles_1.prepareStaticPreviewProjectFiles)({
2955
+ sourceDir: args.sourceDir,
2956
+ entryPath,
2957
+ isWebsite: args.isWebsite,
2958
+ });
2911
2959
  const store = this.variantHistory.store;
2912
2960
  const tree = await store.putTree({
2913
2961
  projectPath: args.projectPath,
@@ -2917,19 +2965,9 @@ class AgentVariantsOrchestrator {
2917
2965
  });
2918
2966
  const gitRoot = (await this.worktrees.getGitRoot?.()) ?? args.projectPath;
2919
2967
  const relative = path_1.default.relative(gitRoot, args.projectPath);
2920
- if (relative === '..' ||
2921
- relative.startsWith(`..${path_1.default.sep}`) ||
2922
- path_1.default.isAbsolute(relative)) {
2968
+ if (!(0, pathContainment_1.isPathWithinRoot)(gitRoot, args.projectPath)) {
2923
2969
  throw new errors_1.AgentVariantsError('RUNTIME_VALIDATION_FAILED', 'Artifact project must be inside its Git root.');
2924
2970
  }
2925
- const files = fs_1.default
2926
- .readdirSync(args.sourceDir, { recursive: true, withFileTypes: true })
2927
- .filter((entry) => entry.isFile())
2928
- .map((entry) => path_1.default
2929
- .relative(args.sourceDir, path_1.default.join(entry.parentPath, entry.name))
2930
- .split(path_1.default.sep)
2931
- .join('/'))
2932
- .filter((file) => !isEntryMapped || file !== 'index.html');
2933
2971
  return store.diffFiles({
2934
2972
  projectPath: args.projectPath,
2935
2973
  fromRef: base.commitSha,
@@ -2946,31 +2984,36 @@ class AgentVariantsOrchestrator {
2946
2984
  const contextRoots = projectContext.kind === 'fresh'
2947
2985
  ? [projectContext.workspacePath, projectContext.workspaceRoot]
2948
2986
  : [historyProjectPath];
2949
- const input = this.store.getWorkItemInput(args.sessionId, args.workItemId);
2987
+ const input = this.store.requireVariantWorkItemInput({
2988
+ sessionId: args.sessionId,
2989
+ workItemId: args.workItemId,
2990
+ kinds: ['static_preview', 'code_gen'],
2991
+ });
2950
2992
  const sessionPrompt = this.store.getPrompt(args.sessionId);
2951
2993
  const designArtifact = (0, designContextArtifacts_1.resolveDesignArtifact)(input.designContextEntry);
2952
2994
  const worktreeRecord = this.workspaceInventory.getWorktree(args.sessionId, args.workItemId);
2953
2995
  const staticPreview = this.workspaceInventory.getStaticPreview(args.sessionId, args.workItemId);
2954
2996
  let sourceDir = null;
2955
2997
  let tmpStagingDir = null;
2998
+ let staticEntryPath = 'index.html';
2956
2999
  if (worktreeRecord && fs_1.default.existsSync(worktreeRecord.worktreePath)) {
2957
3000
  sourceDir = worktreeRecord.worktreePath;
2958
3001
  }
2959
3002
  else if (staticPreview) {
2960
- tmpStagingDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), `rivet-variant-${args.workItemId}-`));
2961
- (0, variantWorkspaceFiles_1.copyStaticPreviewDirectory)(staticPreview.assetBase, tmpStagingDir);
2962
- let stagedHtml = '';
2963
- try {
2964
- stagedHtml = fs_1.default.readFileSync(path_1.default.join(staticPreview.assetBase, 'index.html'), 'utf8');
2965
- }
2966
- catch (err) {
2967
- log.warn(`persistCompletedArtifactVariant: could not read index.html for ${args.workItemId}`, err);
2968
- }
2969
- fs_1.default.writeFileSync(path_1.default.join(tmpStagingDir, 'index.html'), stagedHtml, 'utf8');
2970
- if (projectContext.kind === 'fresh') {
2971
- fs_1.default.writeFileSync(path_1.default.join(tmpStagingDir, 'brief.md'), `# ${input.briefLabel}\n\n${input.briefBody}\n`, 'utf8');
2972
- }
2973
- sourceDir = tmpStagingDir;
3003
+ const staged = (0, staticPreviewFiles_1.stageStaticPreviewFiles)({
3004
+ preview: staticPreview,
3005
+ workItemId: args.workItemId,
3006
+ environment: projectContext.kind === 'existing'
3007
+ ? await this.resolveEnv(args.sessionId)
3008
+ : undefined,
3009
+ isWebsite: Boolean(input.previewRoutes?.length),
3010
+ briefMarkdown: projectContext.kind === 'fresh'
3011
+ ? `# ${input.briefLabel}\n\n${input.briefBody}\n`
3012
+ : undefined,
3013
+ });
3014
+ tmpStagingDir = staged.rootPath;
3015
+ sourceDir = staged.rootPath;
3016
+ staticEntryPath = staged.entryPath;
2974
3017
  }
2975
3018
  if (!sourceDir) {
2976
3019
  log.warn(`persistCompletedArtifactVariant: no source for ${args.workItemId} (session ${args.sessionId}); skipping`);
@@ -2979,7 +3022,7 @@ class AgentVariantsOrchestrator {
2979
3022
  const changedFilesCount = staticPreview ? 1 : (0, variantWorkspaceFiles_1.countWorktreeFiles)(sourceDir);
2980
3023
  const runningPreview = this.previewRuntime.getRunningVariant(args.sessionId, args.workItemId);
2981
3024
  const preview = staticPreview
2982
- ? { kind: 'static', entryPath: 'index.html' }
3025
+ ? { kind: 'static', entryPath: staticEntryPath }
2983
3026
  : {
2984
3027
  kind: 'dev-server',
2985
3028
  command: {
@@ -2989,7 +3032,7 @@ class AgentVariantsOrchestrator {
2989
3032
  },
2990
3033
  };
2991
3034
  const serve = staticPreview
2992
- ? { kind: 'static', entryPath: 'index.html' }
3035
+ ? { kind: 'static', entryPath: staticEntryPath }
2993
3036
  : worktreeRecord && runningPreview
2994
3037
  ? {
2995
3038
  kind: 'dev-server',
@@ -3019,6 +3062,7 @@ class AgentVariantsOrchestrator {
3019
3062
  workItemId: args.workItemId,
3020
3063
  sourceDir,
3021
3064
  projectPath: historyProjectPath,
3065
+ isWebsite: Boolean(input.previewRoutes?.length),
3022
3066
  })
3023
3067
  : undefined;
3024
3068
  await this.variantHistory.persistVariant({
@@ -3027,9 +3071,10 @@ class AgentVariantsOrchestrator {
3027
3071
  variantId: args.workItemId,
3028
3072
  ...(input.requestId ? { requestId: input.requestId } : {}),
3029
3073
  label: input.briefLabel,
3030
- brief: input.briefBody,
3074
+ brief: input.briefBody ?? '',
3031
3075
  references: input.references,
3032
3076
  referenceContext: input.context,
3077
+ previewRoutes: input.previewRoutes,
3033
3078
  referenceContextRoots: contextRoots
3034
3079
  .filter((projectPath) => Boolean(projectPath))
3035
3080
  .map((projectPath) => path_1.default.join(this.variantHistory.store.storage.resolve(projectPath)
@@ -3207,8 +3252,8 @@ class AgentVariantsOrchestrator {
3207
3252
  const manifestEntries = [];
3208
3253
  let chosenSlug = '';
3209
3254
  for (const variant of variants) {
3210
- const input = this.store.getWorkItemInput(args.sessionId, variant.workItemId);
3211
- const label = input.briefLabel ?? variant.label ?? 'variant';
3255
+ const input = this.store.getVariantWorkItemInput(args.sessionId, variant.workItemId);
3256
+ const label = input?.briefLabel ?? variant.label ?? 'variant';
3212
3257
  const slug = (0, createProjectArtifacts_1.createProjectVariantSlug)(label);
3213
3258
  const briefIdx = briefIndexById.get(variant.briefId) ?? 0;
3214
3259
  const numericPrefix = String(briefIdx + 1).padStart(2, '0');