rivet-design 0.14.10 → 0.14.12

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 (101) hide show
  1. package/dist/agent-variants/SessionStore.d.ts +11 -1
  2. package/dist/agent-variants/SessionStore.d.ts.map +1 -1
  3. package/dist/agent-variants/SessionStore.js +21 -0
  4. package/dist/agent-variants/SessionStore.js.map +1 -1
  5. package/dist/agent-variants/WorkerExecutorService.d.ts +15 -2
  6. package/dist/agent-variants/WorkerExecutorService.d.ts.map +1 -1
  7. package/dist/agent-variants/WorkerExecutorService.js +48 -13
  8. package/dist/agent-variants/WorkerExecutorService.js.map +1 -1
  9. package/dist/agent-variants/WorktreeOrchestrator.d.ts +15 -0
  10. package/dist/agent-variants/WorktreeOrchestrator.d.ts.map +1 -1
  11. package/dist/agent-variants/WorktreeOrchestrator.js +73 -30
  12. package/dist/agent-variants/WorktreeOrchestrator.js.map +1 -1
  13. package/dist/agent-variants/contextAssets.d.ts +23 -0
  14. package/dist/agent-variants/contextAssets.d.ts.map +1 -0
  15. package/dist/agent-variants/contextAssets.js +199 -0
  16. package/dist/agent-variants/contextAssets.js.map +1 -0
  17. package/dist/agent-variants/contracts.d.ts +752 -180
  18. package/dist/agent-variants/contracts.d.ts.map +1 -1
  19. package/dist/agent-variants/contracts.js +33 -2
  20. package/dist/agent-variants/contracts.js.map +1 -1
  21. package/dist/agent-variants/variantContext.d.ts +2 -1
  22. package/dist/agent-variants/variantContext.d.ts.map +1 -1
  23. package/dist/agent-variants/variantContext.js +9 -0
  24. package/dist/agent-variants/variantContext.js.map +1 -1
  25. package/dist/agent-variants/workItemBriefing.d.ts.map +1 -1
  26. package/dist/agent-variants/workItemBriefing.js +60 -16
  27. package/dist/agent-variants/workItemBriefing.js.map +1 -1
  28. package/dist/agent-variants/workerRuntime.d.ts +18 -4
  29. package/dist/agent-variants/workerRuntime.d.ts.map +1 -1
  30. package/dist/agent-variants/workerRuntime.js +65 -12
  31. package/dist/agent-variants/workerRuntime.js.map +1 -1
  32. package/dist/cli/commands/mcpServe.d.ts +3 -1
  33. package/dist/cli/commands/mcpServe.d.ts.map +1 -1
  34. package/dist/cli/commands/mcpServe.js +179 -24
  35. package/dist/cli/commands/mcpServe.js.map +1 -1
  36. package/dist/cli/commands/reference.d.ts.map +1 -1
  37. package/dist/cli/commands/reference.js +10 -4
  38. package/dist/cli/commands/reference.js.map +1 -1
  39. package/dist/cli/commands/serve.d.ts.map +1 -1
  40. package/dist/cli/commands/serve.js +36 -7
  41. package/dist/cli/commands/serve.js.map +1 -1
  42. package/dist/cli/commands/variants.d.ts.map +1 -1
  43. package/dist/cli/commands/variants.js +95 -1
  44. package/dist/cli/commands/variants.js.map +1 -1
  45. package/dist/cli/commands/wait.d.ts +38 -0
  46. package/dist/cli/commands/wait.d.ts.map +1 -1
  47. package/dist/cli/commands/wait.js +16 -2
  48. package/dist/cli/commands/wait.js.map +1 -1
  49. package/dist/cli/hostWorkNextAction.d.ts +4 -0
  50. package/dist/cli/hostWorkNextAction.d.ts.map +1 -1
  51. package/dist/cli/hostWorkNextAction.js.map +1 -1
  52. package/dist/cli/router.d.ts.map +1 -1
  53. package/dist/cli/router.js +4 -1
  54. package/dist/cli/router.js.map +1 -1
  55. package/dist/cli/telemetry.d.ts +14 -0
  56. package/dist/cli/telemetry.d.ts.map +1 -0
  57. package/dist/cli/telemetry.js +71 -0
  58. package/dist/cli/telemetry.js.map +1 -0
  59. package/dist/config/telemetryContract.d.ts +3 -0
  60. package/dist/config/telemetryContract.d.ts.map +1 -0
  61. package/dist/config/telemetryContract.js +6 -0
  62. package/dist/config/telemetryContract.js.map +1 -0
  63. package/dist/index.d.ts +18 -0
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +95 -6
  66. package/dist/index.js.map +1 -1
  67. package/dist/routes/agentVariants.d.ts.map +1 -1
  68. package/dist/routes/agentVariants.js +20 -0
  69. package/dist/routes/agentVariants.js.map +1 -1
  70. package/dist/services/TelemetryService.d.ts +47 -10
  71. package/dist/services/TelemetryService.d.ts.map +1 -1
  72. package/dist/services/TelemetryService.js +66 -13
  73. package/dist/services/TelemetryService.js.map +1 -1
  74. package/dist/services/VariantGenerationService.d.ts.map +1 -1
  75. package/dist/services/VariantGenerationService.js +21 -9
  76. package/dist/services/VariantGenerationService.js.map +1 -1
  77. package/dist/services/VariantHistoryService.d.ts +7 -0
  78. package/dist/services/VariantHistoryService.d.ts.map +1 -1
  79. package/dist/services/VariantHistoryService.js +1 -0
  80. package/dist/services/VariantHistoryService.js.map +1 -1
  81. package/dist/services/VariantRunService.d.ts.map +1 -1
  82. package/dist/services/VariantRunService.js +5 -1
  83. package/dist/services/VariantRunService.js.map +1 -1
  84. package/dist/types/change-request-types.d.ts +25 -0
  85. package/dist/types/change-request-types.d.ts.map +1 -1
  86. package/dist/types/change-request-types.js +0 -5
  87. package/dist/types/change-request-types.js.map +1 -1
  88. package/dist/utils/skills/claude-skill.d.ts +2 -2
  89. package/dist/utils/skills/claude-skill.d.ts.map +1 -1
  90. package/dist/utils/skills/claude-skill.js +1 -1
  91. package/dist/utils/skills/cli-guidance.d.ts +2 -2
  92. package/dist/utils/skills/cli-guidance.d.ts.map +1 -1
  93. package/dist/utils/skills/cli-guidance.js +4 -2
  94. package/dist/utils/skills/cli-guidance.js.map +1 -1
  95. package/dist/utils/skills/cursor-rules.d.ts +2 -2
  96. package/dist/utils/skills/cursor-rules.d.ts.map +1 -1
  97. package/dist/utils/skills/cursor-rules.js +1 -1
  98. package/package.json +1 -1
  99. package/src/ui/dist/assets/main-CgF_gMPR.js +422 -0
  100. package/src/ui/dist/index.html +1 -1
  101. package/src/ui/dist/assets/main-QevbGOvt.js +0 -422
@@ -29,6 +29,7 @@ const VariantWorkspaceManager_1 = require("./VariantWorkspaceManager");
29
29
  const diffQa_1 = require("./diffQa");
30
30
  const VariantHistoryService_1 = require("../services/VariantHistoryService");
31
31
  const variantContext_1 = require("./variantContext");
32
+ const contextAssets_1 = require("./contextAssets");
32
33
  const log = (0, logger_1.createLogger)('AgentVariantsOrchestrator');
33
34
  const FRESH_DEV_SERVER_HOST = '127.0.0.1';
34
35
  const BRIEF_LABEL_MAX_LENGTH = 48;
@@ -142,28 +143,16 @@ function withProvisionTimeout(work, timeoutMs) {
142
143
  return Promise.race([work, timeout]).finally(() => clearTimeout(timer));
143
144
  }
144
145
  /**
145
- * Allowlist of asset file extensions an agent-planned source may have.
146
- * `assetPlan` is sized for large local *assets* (3D models, images,
147
- * audio, video, fonts) — never code, dotfiles, secrets, or arbitrary
148
- * configs. The check is defense-in-depth alongside the path / symlink
149
- * filters in `copyAssetIntoWorktree`; without it, a prompt-injected
150
- * source plan could copy readable host files such as SSH keys or
151
- * project secrets into the generated app.
152
- *
153
- * Intentionally excludes `.json`, `.txt`, `.md`, `.csv`: these are
154
- * common carriers for credentials (`credentials.json`, `.aws/config`,
155
- * shell history `.txt`, README-shaped secrets) and have no legitimate
156
- * use as binary preview assets. If a future flow needs structured data
157
- * it should ship it through the manifest instead of file copy.
146
+ * File types an agent-authored asset plan may copy into a generated preview.
147
+ * This allowlist protects an agent-controlled path; caller-selected context
148
+ * assets use the separate, type-neutral delivery path.
158
149
  */
159
- const ALLOWED_ASSET_EXTENSIONS = new Set([
160
- // 3D / models
150
+ const ALLOWED_INERT_ASSET_EXTENSIONS = new Set([
161
151
  '.glb',
162
152
  '.gltf',
163
153
  '.obj',
164
154
  '.fbx',
165
155
  '.usdz',
166
- // images
167
156
  '.png',
168
157
  '.jpg',
169
158
  '.jpeg',
@@ -173,22 +162,18 @@ const ALLOWED_ASSET_EXTENSIONS = new Set([
173
162
  '.avif',
174
163
  '.bmp',
175
164
  '.ico',
176
- // video
177
165
  '.mp4',
178
166
  '.webm',
179
167
  '.mov',
180
- // audio
181
168
  '.mp3',
182
169
  '.wav',
183
170
  '.ogg',
184
171
  '.m4a',
185
- // fonts
186
172
  '.woff',
187
173
  '.woff2',
188
174
  '.ttf',
189
175
  '.otf',
190
176
  '.eot',
191
- // PDFs
192
177
  '.pdf',
193
178
  ]);
194
179
  /**
@@ -267,7 +252,7 @@ function copyAssetIntoWorktree(worktreePath, entry, assetSourceRoot) {
267
252
  ? entry.source
268
253
  : path_1.default.resolve(assetSourceRoot, entry.source);
269
254
  const ext = path_1.default.extname(absoluteSource).toLowerCase();
270
- if (!ALLOWED_ASSET_EXTENSIONS.has(ext)) {
255
+ if (!ALLOWED_INERT_ASSET_EXTENSIONS.has(ext)) {
271
256
  throw new errors_1.AgentVariantsError('RUNTIME_VALIDATION_FAILED', `assetPlan.source extension '${ext || '(none)'}' is not on the allowlist (got '${entry.source}'). Only inert media/font/document assets may be copied.`);
272
257
  }
273
258
  // lstat first: a symlink whose target lies outside the source path
@@ -331,7 +316,7 @@ function copyAssetIntoWorktree(worktreePath, entry, assetSourceRoot) {
331
316
  throw new errors_1.AgentVariantsError('RUNTIME_VALIDATION_FAILED', `assetPlan.source traverses a sensitive directory and is refused: ${entry.source}`);
332
317
  }
333
318
  const resolvedExt = path_1.default.extname(resolvedSource).toLowerCase();
334
- if (!ALLOWED_ASSET_EXTENSIONS.has(resolvedExt)) {
319
+ if (!ALLOWED_INERT_ASSET_EXTENSIONS.has(resolvedExt)) {
335
320
  throw new errors_1.AgentVariantsError('RUNTIME_VALIDATION_FAILED', `assetPlan.source resolved extension '${resolvedExt || '(none)'}' is not on the allowlist (resolved from '${entry.source}').`);
336
321
  }
337
322
  const normalizedDest = path_1.default.normalize(entry.destination);
@@ -559,6 +544,7 @@ class AgentVariantsOrchestrator {
559
544
  requestedCount: args.count ?? contracts_1.DEFAULT_VARIANT_COUNT,
560
545
  });
561
546
  }
547
+ const designContextCount = projectContext.designContext?.length ?? 0;
562
548
  this.telemetry.track('agent_variants.session_started', {
563
549
  source: 'mcp',
564
550
  sessionId: result.sessionId,
@@ -566,6 +552,8 @@ class AgentVariantsOrchestrator {
566
552
  hasTarget: Boolean(args.target),
567
553
  targetType: args.target?.type ?? null,
568
554
  projectContextKind: args.projectContext?.kind ?? 'existing',
555
+ design_context_count: designContextCount,
556
+ design_context_kinds: designContextCount > 0 ? ['design_system'] : [],
569
557
  });
570
558
  this.emitChange();
571
559
  return result;
@@ -660,6 +648,7 @@ class AgentVariantsOrchestrator {
660
648
  : undefined;
661
649
  const artifacts = buildSessionArtifacts(sessionId, sessionProjectContext);
662
650
  const hostWork = this.getHostWork(sessionId);
651
+ const workerRuntime = this.store.getWorkerRuntime(sessionId);
663
652
  return {
664
653
  active: true,
665
654
  sessionId,
@@ -672,8 +661,22 @@ class AgentVariantsOrchestrator {
672
661
  ...(destinationPath ? { destinationPath } : {}),
673
662
  ...(artifacts.length > 0 ? { artifacts } : {}),
674
663
  ...(hostWork.length > 0 ? { hostWork } : {}),
664
+ ...(workerRuntime ? { workerRuntime } : {}),
675
665
  };
676
666
  }
667
+ /** Record which worker runtime this session's current batch leases to —
668
+ * called by the generation services right after the lease-owner decision
669
+ * so `variants start`/status can answer "what is running these?". */
670
+ setWorkerRuntime(sessionId, summary) {
671
+ if (!this.store.hasSession(sessionId))
672
+ return;
673
+ this.store.setWorkerRuntime(sessionId, summary);
674
+ // Push a fresh snapshot to SSE subscribers: startUnified/requestWork
675
+ // already emitted before this setter ran, and without an emit here a
676
+ // subscribed client would not see workerRuntime until the next state
677
+ // transition (possibly the first worker completion).
678
+ this.emitChange();
679
+ }
677
680
  /** User reference files stored in the work item's context bundle (uploaded
678
681
  * or copied local images). Surfaced on the snapshot so briefings can point
679
682
  * workers at the files directly — one Read instead of a bundle walk. */
@@ -682,7 +685,7 @@ class AgentVariantsOrchestrator {
682
685
  .filter((source) => source.transport === 'file')
683
686
  .map((source) => ({
684
687
  path: source.path,
685
- ...(source.label ?? source.originalFilename
688
+ ...((source.label ?? source.originalFilename)
686
689
  ? { label: source.label ?? source.originalFilename }
687
690
  : {}),
688
691
  }));
@@ -704,6 +707,9 @@ class AgentVariantsOrchestrator {
704
707
  workItemId: item.workId,
705
708
  kind,
706
709
  });
710
+ const contextAssets = this.resources
711
+ .get(sessionId)
712
+ ?.contextAssets.get(item.workId);
707
713
  const mode = input.sourceVariantId
708
714
  ? 'vary'
709
715
  : DEFAULT_EXECUTION_MODE_BY_KIND[kind];
@@ -741,6 +747,7 @@ class AgentVariantsOrchestrator {
741
747
  ? { contextBundlePath: input.context.contextBundlePath }
742
748
  : {}),
743
749
  ...(AgentVariantsOrchestrator.contextFilesOf(input.context) ?? {}),
750
+ ...(contextAssets?.length ? { contextAssets } : {}),
744
751
  completion: kind === 'code_gen'
745
752
  ? { kind: 'worktree_diff' }
746
753
  : { kind: 'static_artifact' },
@@ -1059,12 +1066,12 @@ class AgentVariantsOrchestrator {
1059
1066
  const result = this.store.requestWork(args);
1060
1067
  try {
1061
1068
  this.ensureStaticWorkspaces(args.sessionId, result.leasedWorkItems);
1069
+ this.materializeContextAssets(args.sessionId, result.leasedWorkItems);
1062
1070
  }
1063
1071
  catch (error) {
1064
1072
  for (const item of result.leasedWorkItems) {
1065
- if (item.kind !== 'static_preview' && item.kind !== 'refine_variant') {
1073
+ if (!isImplementationWorkItemKind(item.kind))
1066
1074
  continue;
1067
- }
1068
1075
  try {
1069
1076
  this.store.reportComplete({
1070
1077
  sessionId: args.sessionId,
@@ -1076,7 +1083,7 @@ class AgentVariantsOrchestrator {
1076
1083
  code: 'RUNTIME_VALIDATION_FAILED',
1077
1084
  message: error instanceof Error
1078
1085
  ? error.message
1079
- : 'Failed to assign static variant workspace',
1086
+ : 'Failed to prepare variant workspace',
1080
1087
  },
1081
1088
  });
1082
1089
  }
@@ -1118,6 +1125,24 @@ class AgentVariantsOrchestrator {
1118
1125
  this.emitChange();
1119
1126
  return decorated;
1120
1127
  }
1128
+ /** @effect Copies caller-supplied context assets into each leased workspace. */
1129
+ materializeContextAssets(sessionId, items) {
1130
+ const resources = this.ensureResources(sessionId);
1131
+ for (const item of items) {
1132
+ if (!isImplementationWorkItemKind(item.kind))
1133
+ continue;
1134
+ const input = (item.input ?? {});
1135
+ const assets = input.context?.contextAssets ?? [];
1136
+ if (assets.length === 0)
1137
+ continue;
1138
+ const workspace = this.getAssignedWorkspace({
1139
+ sessionId,
1140
+ workItemId: item.id,
1141
+ kind: item.kind,
1142
+ });
1143
+ resources.contextAssets.set(item.id, (0, contextAssets_1.materializeContextAssets)({ assets, workspace }));
1144
+ }
1145
+ }
1121
1146
  /**
1122
1147
  * @effect Writes each leased implementation item's server-authored briefing
1123
1148
  * BESIDE its workspace so the coordinating host dispatches workers with a
@@ -1919,6 +1944,7 @@ class AgentVariantsOrchestrator {
1919
1944
  const projectContext = args.projectContext ?? {
1920
1945
  kind: 'existing',
1921
1946
  };
1947
+ const designContextCount = projectContext.designContext?.length ?? 0;
1922
1948
  // Fresh source-grounded sessions (a captured context bundle on a fresh
1923
1949
  // project) must run through `propose` so the source-research/source_plan
1924
1950
  // flow gates generation; start_variants routes them there before reaching
@@ -2041,6 +2067,8 @@ class AgentVariantsOrchestrator {
2041
2067
  hasTarget: Boolean(args.target),
2042
2068
  targetType: args.target?.type ?? null,
2043
2069
  projectContextKind: projectContext.kind,
2070
+ design_context_count: designContextCount,
2071
+ design_context_kinds: designContextCount > 0 ? ['design_system'] : [],
2044
2072
  });
2045
2073
  sessionId = proposeResult.sessionId;
2046
2074
  scaffoldBaseWorkItemId = approveResult.scaffoldBaseWorkItemId ?? null;
@@ -2230,7 +2258,11 @@ class AgentVariantsOrchestrator {
2230
2258
  async provisionAppendedExistingWorktrees(sessionId, workItemIds) {
2231
2259
  if (workItemIds.length === 0)
2232
2260
  return;
2233
- await this.withProvisioningTelemetry({ sessionId, kind: 'appended_existing', variantCount: workItemIds.length }, async () => {
2261
+ await this.withProvisioningTelemetry({
2262
+ sessionId,
2263
+ kind: 'appended_existing',
2264
+ variantCount: workItemIds.length,
2265
+ }, async () => {
2234
2266
  const resources = this.ensureResources(sessionId);
2235
2267
  const instanceKeyPrefix = `a${(0, crypto_1.randomUUID)().slice(0, 8)}-`;
2236
2268
  const paths = await withProvisionTimeout(this.worktrees.createWorktrees(sessionId, workItemIds.length, instanceKeyPrefix), this.provisionTimeoutMs);
@@ -4223,7 +4255,7 @@ class AgentVariantsOrchestrator {
4223
4255
  label: input.briefLabel,
4224
4256
  brief: input.briefBody,
4225
4257
  sessionPrompt,
4226
- runLabel: this.store.getRunLabel(args.sessionId),
4258
+ runLabel: input.runLabel ?? this.store.getRunLabel(args.sessionId),
4227
4259
  kind: 'diff',
4228
4260
  diff: args.diff,
4229
4261
  sourceDir,
@@ -4236,6 +4268,11 @@ class AgentVariantsOrchestrator {
4236
4268
  baseDir,
4237
4269
  serve,
4238
4270
  parentVariant: this.resolveHistoryParentVariant(args.sessionId, input.sourceVariantId),
4271
+ ...(this.store.getWorkItemRuntime(args.sessionId, args.workItemId)
4272
+ ? {
4273
+ runtime: this.store.getWorkItemRuntime(args.sessionId, args.workItemId),
4274
+ }
4275
+ : {}),
4239
4276
  });
4240
4277
  }
4241
4278
  /**
@@ -4463,7 +4500,7 @@ class AgentVariantsOrchestrator {
4463
4500
  label: input.briefLabel,
4464
4501
  brief: input.briefBody,
4465
4502
  sessionPrompt,
4466
- runLabel: this.store.getRunLabel(args.sessionId),
4503
+ runLabel: input.runLabel ?? this.store.getRunLabel(args.sessionId),
4467
4504
  kind: 'project-created',
4468
4505
  sourceDir,
4469
4506
  preview,
@@ -4474,6 +4511,11 @@ class AgentVariantsOrchestrator {
4474
4511
  snapshotDir: sourceDir,
4475
4512
  serve,
4476
4513
  parentVariant: this.resolveHistoryParentVariant(args.sessionId, input.sourceVariantId),
4514
+ ...(this.store.getWorkItemRuntime(args.sessionId, args.workItemId)
4515
+ ? {
4516
+ runtime: this.store.getWorkItemRuntime(args.sessionId, args.workItemId),
4517
+ }
4518
+ : {}),
4477
4519
  });
4478
4520
  }
4479
4521
  finally {
@@ -5272,6 +5314,7 @@ class AgentVariantsOrchestrator {
5272
5314
  worktrees: new Map(),
5273
5315
  staticPreviews: new Map(),
5274
5316
  workspaceManager: new VariantWorkspaceManager_1.VariantWorkspaceManager(),
5317
+ contextAssets: new Map(),
5275
5318
  cleanupStarted: false,
5276
5319
  committedVariantIds: new Set(),
5277
5320
  startedAt: Date.now(),
@@ -6166,7 +6209,7 @@ const STATIC_PREVIEW_HISTORY_EXCLUDE = new Set([
6166
6209
  '.rivet',
6167
6210
  ]);
6168
6211
  const STATIC_PREVIEW_HISTORY_FILE_EXTENSIONS = new Set([
6169
- ...ALLOWED_ASSET_EXTENSIONS,
6212
+ ...ALLOWED_INERT_ASSET_EXTENSIONS,
6170
6213
  '.css',
6171
6214
  '.htm',
6172
6215
  '.html',