rivet-design 0.12.1 → 0.12.3

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 (85) hide show
  1. package/README.md +14 -34
  2. package/README.npm.md +14 -34
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +0 -12
  5. package/dist/index.js.map +1 -1
  6. package/dist/mcp/agent-variants/areNaSourceContext.d.ts +0 -1
  7. package/dist/mcp/agent-variants/areNaSourceContext.d.ts.map +1 -1
  8. package/dist/mcp/agent-variants/areNaSourceContext.js +3 -12
  9. package/dist/mcp/agent-variants/areNaSourceContext.js.map +1 -1
  10. package/dist/mcp/agent-variants/contracts.d.ts +561 -101
  11. package/dist/mcp/agent-variants/contracts.d.ts.map +1 -1
  12. package/dist/mcp/agent-variants/contracts.js +51 -24
  13. package/dist/mcp/agent-variants/contracts.js.map +1 -1
  14. package/dist/mcp/agent-variants/createZeroToOneTool.d.ts +1 -1
  15. package/dist/mcp/agent-variants/createZeroToOneTool.d.ts.map +1 -1
  16. package/dist/mcp/agent-variants/createZeroToOneTool.js +9 -13
  17. package/dist/mcp/agent-variants/createZeroToOneTool.js.map +1 -1
  18. package/dist/mcp/agent-variants/pinterestSourceContext.d.ts +0 -1
  19. package/dist/mcp/agent-variants/pinterestSourceContext.d.ts.map +1 -1
  20. package/dist/mcp/agent-variants/pinterestSourceContext.js +3 -18
  21. package/dist/mcp/agent-variants/pinterestSourceContext.js.map +1 -1
  22. package/dist/mcp/agent-variants/tools.d.ts +16 -2
  23. package/dist/mcp/agent-variants/tools.d.ts.map +1 -1
  24. package/dist/mcp/agent-variants/tools.js +149 -247
  25. package/dist/mcp/agent-variants/tools.js.map +1 -1
  26. package/dist/mcp/auth/tools.d.ts.map +1 -1
  27. package/dist/mcp/auth/tools.js +3 -8
  28. package/dist/mcp/auth/tools.js.map +1 -1
  29. package/dist/mcp/instructions.d.ts +11 -2
  30. package/dist/mcp/instructions.d.ts.map +1 -1
  31. package/dist/mcp/instructions.js +20 -5
  32. package/dist/mcp/instructions.js.map +1 -1
  33. package/dist/mcp/integrations/tools.d.ts +5 -1
  34. package/dist/mcp/integrations/tools.d.ts.map +1 -1
  35. package/dist/mcp/integrations/tools.js +59 -30
  36. package/dist/mcp/integrations/tools.js.map +1 -1
  37. package/dist/mcp/server.d.ts.map +1 -1
  38. package/dist/mcp/server.js +46 -21
  39. package/dist/mcp/server.js.map +1 -1
  40. package/dist/mcp/toolAnalytics.d.ts +11 -0
  41. package/dist/mcp/toolAnalytics.d.ts.map +1 -1
  42. package/dist/mcp/toolAnalytics.js +8 -0
  43. package/dist/mcp/toolAnalytics.js.map +1 -1
  44. package/dist/routes/agentVariants.d.ts.map +1 -1
  45. package/dist/routes/agentVariants.js +17 -9
  46. package/dist/routes/agentVariants.js.map +1 -1
  47. package/dist/routes/mcp.d.ts.map +1 -1
  48. package/dist/routes/mcp.js +18 -11
  49. package/dist/routes/mcp.js.map +1 -1
  50. package/dist/services/ConfigManager.d.ts +13 -0
  51. package/dist/services/ConfigManager.d.ts.map +1 -1
  52. package/dist/services/ConfigManager.js +24 -0
  53. package/dist/services/ConfigManager.js.map +1 -1
  54. package/dist/services/IntegrationsClient.d.ts +2 -3
  55. package/dist/services/IntegrationsClient.d.ts.map +1 -1
  56. package/dist/services/IntegrationsClient.js.map +1 -1
  57. package/dist/services/TelemetryService.d.ts +4 -0
  58. package/dist/services/TelemetryService.d.ts.map +1 -1
  59. package/dist/services/TelemetryService.js +19 -0
  60. package/dist/services/TelemetryService.js.map +1 -1
  61. package/dist/services/createAgentVariantsOrchestrator.d.ts +16 -0
  62. package/dist/services/createAgentVariantsOrchestrator.d.ts.map +1 -1
  63. package/dist/services/createAgentVariantsOrchestrator.js +60 -2
  64. package/dist/services/createAgentVariantsOrchestrator.js.map +1 -1
  65. package/dist/utils/skills/claude-skill.d.ts +1 -1
  66. package/dist/utils/skills/claude-skill.d.ts.map +1 -1
  67. package/dist/utils/skills/claude-skill.js +16 -6
  68. package/dist/utils/skills/claude-skill.js.map +1 -1
  69. package/dist/utils/skills/cursor-rules.d.ts +1 -1
  70. package/dist/utils/skills/cursor-rules.d.ts.map +1 -1
  71. package/dist/utils/skills/cursor-rules.js +16 -6
  72. package/dist/utils/skills/cursor-rules.js.map +1 -1
  73. package/dist/utils/skills/describe-motion-protocol.d.ts +1 -1
  74. package/dist/utils/skills/describe-motion-protocol.d.ts.map +1 -1
  75. package/dist/utils/skills/describe-motion-protocol.js +1 -1
  76. package/dist/utils/skills/shared-variants-protocol.d.ts +20 -2
  77. package/dist/utils/skills/shared-variants-protocol.d.ts.map +1 -1
  78. package/dist/utils/skills/shared-variants-protocol.js +91 -19
  79. package/dist/utils/skills/shared-variants-protocol.js.map +1 -1
  80. package/package.json +16 -38
  81. package/src/ui/dist/assets/main-CLAqO1bm.js +656 -0
  82. package/src/ui/dist/assets/main-Ke-Q9lWa.css +1 -0
  83. package/src/ui/dist/index.html +2 -2
  84. package/src/ui/dist/assets/main-DH8bmUcZ.css +0 -1
  85. package/src/ui/dist/assets/main-Utev2DA9.js +0 -655
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/agent-variants/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/agent-variants/tools.ts"],"names":[],"mappings":"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"}
@@ -17,7 +17,6 @@ const generatedDestination_1 = require("./generatedDestination");
17
17
  Object.defineProperty(exports, "slugifyPrompt", { enumerable: true, get: function () { return generatedDestination_1.slugifyPrompt; } });
18
18
  const createZeroToOneTool_1 = require("./createZeroToOneTool");
19
19
  const ProjectDetectionService_1 = require("../../services/ProjectDetectionService");
20
- const SessionStore_1 = require("./SessionStore");
21
20
  const BrowserAgentClient_1 = require("../../services/BrowserAgentClient");
22
21
  /**
23
22
  * Coerce `output` to a structured value when an agent (incorrectly) sends a
@@ -50,28 +49,6 @@ const buildVisualEditorWatchAction = (sessionId, timing) => ({
50
49
  const manifestKind = (manifest) => {
51
50
  return manifest.artifact.kind === 'diff' ? 'diff' : 'project-created';
52
51
  };
53
- /**
54
- * Reject caller-supplied fresh destinations at the generic variants boundary.
55
- * Fresh projects must go through `start_variants(mode='zero_to_one')`, where
56
- * the server derives the destination path before delegating to the
57
- * orchestrator.
58
- */
59
- const validateFreshProjectInput = (args) => {
60
- if (args.projectContext?.kind !== 'fresh')
61
- return null;
62
- return {
63
- stage: 'failed',
64
- errorCode: 'SCHEMA_VALIDATION_FAILED',
65
- message: "Fresh-project sessions must be started with start_variants(mode='zero_to_one') so Rivet derives and validates the destination path.",
66
- };
67
- };
68
- const callerProjectContext = (projectContext) => {
69
- if (!projectContext)
70
- return undefined;
71
- const safeContext = { ...projectContext };
72
- delete safeContext.variantContext;
73
- return safeContext;
74
- };
75
52
  const normalizeEvidenceUrl = (url) => {
76
53
  try {
77
54
  return new URL(url).href;
@@ -108,19 +85,6 @@ const startVariantsTelemetryFor = (args) => {
108
85
  instructionLength: args.prompt.length,
109
86
  };
110
87
  };
111
- const proposeVariantsTelemetryFor = (args) => {
112
- const projectContextKind = args.projectContext?.kind ?? 'existing';
113
- return {
114
- requestId: args.clientRequestId ?? args.sessionId,
115
- entryPoint: 'mcp_tool',
116
- mode: projectContextKind === 'fresh'
117
- ? 'zero_to_one'
118
- : 'initial_generation',
119
- projectContextKind,
120
- requestedCount: args.count,
121
- instructionLength: args.prompt.length,
122
- };
123
- };
124
88
  const evidenceKey = (url) => normalizeEvidenceUrl(url);
125
89
  const designSystemMetadataBySourceId = (sourcePlan) => {
126
90
  const bySourceId = new Map();
@@ -168,7 +132,7 @@ const assertBrowserEvidenceForUrlDesignSources = (args) => {
168
132
  continue;
169
133
  const attempt = args.attempts.get(evidenceKey(sourceUrl));
170
134
  if (!attempt) {
171
- throw new errors_1.AgentVariantsError('SOURCE_CONTEXT_INVALID', `URL source ${sourceId} must call capture_design_evidence before report_source_plan.`);
135
+ throw new errors_1.AgentVariantsError('SOURCE_CONTEXT_INVALID', `URL source ${sourceId} must call capture_design_evidence before report_work_item(kind='source_plan').`);
172
136
  }
173
137
  const metadata = metadataBySourceId.get(sourceId) ?? [];
174
138
  for (const entry of metadata) {
@@ -197,78 +161,10 @@ function registerAgentVariantsTools(mcp, deps) {
197
161
  sessionAttempts.set(evidenceKey(url), attempt);
198
162
  browserEvidenceAttemptsBySession.set(sessionId, sessionAttempts);
199
163
  };
200
- registerVariantTool(mcp, 'propose_variants', 'Stage 1 of the legacy variants flow. Prefer `start_variants` for new code paths — it collapses propose + report_briefs + request_work into a single call. Reporting briefs starts every direction immediately; there is no in-chat approval gate. Returns { sessionId, briefWorkItem }. Full protocol in the rivet skill.', contracts_1.proposeVariantsInput, async (args) => {
201
- const requestTelemetry = proposeVariantsTelemetryFor(args);
202
- deps.telemetry?.trackAgentVariantsRequestStarted?.(requestTelemetry);
203
- try {
204
- const failure = validateFreshProjectInput(args);
205
- if (failure) {
206
- deps.telemetry?.trackAgentVariantsRequestRejected?.({
207
- ...requestTelemetry,
208
- failureReason: 'schema_validation_failed',
209
- });
210
- return jsonResponse(failure);
211
- }
212
- const result = deps.orchestrator.propose({
213
- sessionId: args.sessionId,
214
- prompt: args.prompt,
215
- count: args.count,
216
- target: args.target,
217
- projectContext: callerProjectContext(args.projectContext),
218
- runLabel: args.runLabel,
219
- });
220
- if (result.stage === 'awaiting_source_plan') {
221
- const out = {
222
- sessionId: result.sessionId,
223
- stage: 'awaiting_source_plan',
224
- sourcePlanWorkItem: {
225
- id: result.sourcePlanWorkItem.id,
226
- kind: 'source_plan',
227
- attempt: result.sourcePlanWorkItem.attempt,
228
- input: result.sourcePlanWorkItem.input,
229
- output_schema: SessionStore_1.SOURCE_PLAN_OUTPUT_SCHEMA,
230
- },
231
- nextAction: 'continue_variants',
232
- };
233
- deps.telemetry?.trackAgentVariantsRequestAccepted?.({
234
- ...requestTelemetry,
235
- sessionId: result.sessionId,
236
- requestStatus: 'accepted',
237
- acceptedCount: args.count,
238
- });
239
- return jsonResponse(out);
240
- }
241
- const out = {
242
- sessionId: result.sessionId,
243
- stage: 'awaiting_briefs',
244
- briefWorkItem: {
245
- id: result.briefWorkItem.id,
246
- kind: 'brief',
247
- attempt: result.briefWorkItem.attempt,
248
- input: result.briefWorkItem.input,
249
- output_schema: {
250
- briefs: 'Array<{briefId, label: "1–5 word plain-English title naming the direction", body: "one or two plain-English sentences describing the complete variant direction, including the page scope that must remain complete"}>',
251
- },
252
- },
253
- nextAction: 'report_variant_briefs',
254
- };
255
- deps.telemetry?.trackAgentVariantsRequestAccepted?.({
256
- ...requestTelemetry,
257
- sessionId: result.sessionId,
258
- requestStatus: 'accepted',
259
- acceptedCount: args.count,
260
- });
261
- return jsonResponse(out);
262
- }
263
- catch (err) {
264
- deps.telemetry?.trackAgentVariantsRequestRejected?.({
265
- ...requestTelemetry,
266
- failureReason: err,
267
- });
268
- return errorResponse(err);
269
- }
270
- });
271
- registerVariantTool(mcp, 'report_variant_briefs', 'Report drafted briefs for the brief work item. Each brief: label = a 1–5 word plain-English title naming what THIS direction changes (describe the change, not the vibe — no marketing or evocative adjectives; a standalone title, never a "Title — descriptor" compound with em dashes or colons — descriptors go in the body); it is the variant card title the user reads, so make the intent obvious. body = one or two plain-English sentences describing the complete variant direction and the page scope it must preserve. Name the main difference from the other variants, but keep the original user deliverable intact (for example, a complete landing page still needs hero, product/value props, proof, CTA, and footer unless the user asked for less). No bullets, no line breaks, no abbreviations, no value codes. Optional bindings may scope raw context or metadata to a specific brief slot; omit bindings for the default global context behavior. On success, every brief is started immediately and the session lands in work_items_ready — there is no in-chat approval gate, so directions begin generating right away.', contracts_1.reportVariantBriefsInput, async (args) => {
164
+ // --- Unified report_work_item handlers (formerly report_variant_briefs,
165
+ // report_source_plan, report_variant_complete). Each keeps its original body
166
+ // verbatim; report_work_item dispatches on `kind`. ---
167
+ const handleReportBriefs = async (args) => {
272
168
  try {
273
169
  const reported = deps.orchestrator.reportBriefs({
274
170
  sessionId: args.sessionId,
@@ -297,8 +193,8 @@ function registerAgentVariantsTools(mcp, deps) {
297
193
  catch (err) {
298
194
  return errorResponse(err);
299
195
  }
300
- });
301
- registerVariantTool(mcp, 'report_source_plan', 'Report the source plan for the source_plan work item. Inspect raw userContext natively, choose actions from input.availableActions, then report the metadata produced by those actions: extract_design_system must produce design_system metadata, and describe_motion must produce motion_guidance metadata. `actions` and `metadata` are required (every reported action must produce its matching metadata kind). For URL sources, call `capture_design_evidence({ sessionId, url })` FIRST to render the page server-side and get its :root design tokens, computed element styles, fonts, and a screenshot — then SYNTHESIZE design_system data.designMarkdown from that evidence (map role-named tokens, resolve shadcn HSL triplets, read the real fonts, use the screenshot for the accent) and set data.evidenceStatus accordingly. Rivet rejects URL-backed design_system reports without a recorded capture_design_evidence attempt. Do not eyeball a static page when a rendered capture is available. design_system metadata may include data.designMarkdown; when omitted, Rivet synthesizes DESIGN.md from the structured observations. motion_guidance metadata may include data.motionMarkdown plus notes/timings. Raw userContext remains authoritative; metadata is additive shared guidance. Choose vite_app for large local assets, model-viewer, Three.js, route structure, package dependencies, files under public/, or whenever a full app scaffold would materially improve the result; choose static_preview only when one HTML/CSS/JS file can preserve the complete requested scope and visual fidelity. If the requirement is ambiguous, set executionPlan.userQuestion instead of guessing — Rivet will surface it as a clarification blocker at approve time. Reports unlock the brief work item for source-grounded fresh-project sessions.', contracts_1.reportSourcePlanInput, async (args) => {
196
+ };
197
+ const handleReportSourcePlan = async (args) => {
302
198
  try {
303
199
  const attempts = new Map(browserEvidenceAttemptsByUrl);
304
200
  const sessionAttempts = browserEvidenceAttemptsBySession.get(args.sessionId);
@@ -336,14 +232,14 @@ function registerAgentVariantsTools(mcp, deps) {
336
232
  assetCount: plan.assetPlan?.length ?? 0,
337
233
  runtimeRequirementCount: plan.runtimeRequirements?.length ?? 0,
338
234
  },
339
- nextAction: 'report_variant_briefs',
235
+ nextAction: 'report_work_item',
340
236
  };
341
237
  return jsonResponse(out);
342
238
  }
343
239
  catch (err) {
344
240
  return errorResponse(err);
345
241
  }
346
- });
242
+ };
347
243
  registerVariantTool(mcp, 'capture_design_evidence', 'Render a reference URL on a real browser (server-side) and return RENDERED DESIGN EVIDENCE for you to interpret — NOT a finished design system. You get: the page\'s `:root` design tokens (verbatim), computed styles of key elements (colors, type scale, spacing, radius, transitions), the resolved font families, and a screenshot. Pass the current variants sessionId whenever this is part of source planning. Call this for every URL source during source planning BEFORE reporting design_system, then SYNTHESIZE design_system.data.designMarkdown yourself from the evidence: map role-named tokens (--primary/--background/--foreground/--muted/--accent/--border/--radius) to DESIGN.md roles; resolve shadcn HSL-triplet tokens (e.g. "0 0% 9%" means hsl(0 0% 9%)); read the display font from heading element styles and the body font from body/paragraph; use the screenshot to choose the brand/accent color and overall feel. Mark only genuinely-unobservable values as unknown — do not invent. Set data.evidenceStatus to the evidence\'s evidenceStatus. If ok=false, no rendered evidence is available: inspect the URL natively and report design_system with data.evidenceStatus="inferred". Provider keys stay server-side; you only pass the URL.', contracts_1.captureDesignEvidenceInput, async (args) => {
348
244
  try {
349
245
  const client = deps.browserAgentClient ?? new BrowserAgentClient_1.BrowserAgentClient();
@@ -424,45 +320,6 @@ function registerAgentVariantsTools(mcp, deps) {
424
320
  return jsonResponse(out);
425
321
  }
426
322
  });
427
- registerVariantTool(mcp, 'approve_variant_briefs', 'Legacy/no-op in most flows: report_variant_briefs now starts every brief immediately, so directions kick off without an in-chat approval gate. Kept for backward compatibility — provide briefIds for the briefs to generate (typically all of them). Each brief gets a parallel code-gen work item in its own isolated worktree; advance via continue_variants(action="request_work") to run them in parallel. For tweak-with-feedback, use the selections form with bodyOverride per brief. When the session has already started its briefs, this returns the current work_items_ready state idempotently.', contracts_1.approveVariantBriefsInput, async (args) => {
428
- try {
429
- // report_variant_briefs auto-starts the briefs, so a session may
430
- // already be past the approval point. Treat a repeat call as an
431
- // idempotent no-op rather than erroring.
432
- const stage = deps.orchestrator.getStage(args.sessionId);
433
- if (stage === 'work_items_ready' || stage === 'waiting_for_results') {
434
- const variants = deps.orchestrator.getVariants(args.sessionId);
435
- const out = {
436
- stage: 'work_items_ready',
437
- approvedCount: variants.length,
438
- codeGenWorkItemIds: variants.map((v) => v.workItemId),
439
- scaffoldBaseWorkItemId: null,
440
- nextAction: 'continue_variants',
441
- };
442
- return jsonResponse(out);
443
- }
444
- const selections = args.selections ??
445
- (args.briefIds ?? []).map((briefId) => ({ briefId }));
446
- if (selections.length === 0) {
447
- throw new Error('approve_variant_briefs requires either briefIds or selections');
448
- }
449
- const result = await deps.orchestrator.approve({
450
- sessionId: args.sessionId,
451
- selections,
452
- });
453
- const out = {
454
- stage: 'work_items_ready',
455
- approvedCount: result.approvedCount,
456
- codeGenWorkItemIds: result.codeGenWorkItemIds,
457
- scaffoldBaseWorkItemId: result.scaffoldBaseWorkItemId ?? null,
458
- nextAction: 'continue_variants',
459
- };
460
- return jsonResponse(out);
461
- }
462
- catch (err) {
463
- return errorResponse(err);
464
- }
465
- });
466
323
  registerVariantTool(mcp, 'commit_variant', "Call AFTER all variants have been generated AND you've shown each variant's diff/changes to the user in chat AND the user has picked one. Set confirmedByUser=true when the user confirms the pick. Only use bypassRequestedByUser=true (with bypassReason) if the user explicitly asks to bypass confirmation. Pass the variantId (the workItemId of the chosen variant). Rivet looks up that variant's captured diff and enqueues it onto the existing pending-changes channel — call get_pending_changes next to retrieve and apply. Idempotent on (sessionId, variantId).", contracts_1.commitVariantInput, async (args) => {
467
324
  try {
468
325
  assertExplicitUserConfirmation('commit_variant', args, 'commit a variant');
@@ -506,7 +363,7 @@ function registerAgentVariantsTools(mcp, deps) {
506
363
  const pendingVariantRequestsField = () => deps.pendingVariantRequestCount
507
364
  ? { pendingVariantRequests: deps.pendingVariantRequestCount() }
508
365
  : {};
509
- registerVariantTool(mcp, 'continue_variants', 'Long-poll/state-pump the variants flow. action=check returns immediately; action=wait blocks up to ~5min for state changes; action=request_work picks up ready work items (source_research, static_preview, or code_gen depending on stage). For request_work, pass `workItemIds` (e.g. the ids a static_preview_refine batch reported) to lease ONLY that batch — letting concurrent runs handle their own work in parallel; omit it (optionally with requestedLeaseCount) to lease the next ready items. A re-leased work item carrying `input.qaRetry` failed the diff QA gate — read the QA notes, edit the worktree until the diff shows CSS or markup changes, then report_variant_complete again (one retry max). static_preview is for fresh zero-to-one sessions and should return {html, css?, js?} so Rivet can show fast visual previews before Vite/code generation finishes.', contracts_1.continueVariantsInput, async (args) => {
366
+ registerVariantTool(mcp, 'continue_variants', 'Long-poll/state-pump the variants flow. action=check returns immediately; action=wait blocks up to ~5min for state changes; action=request_work picks up ready work items (source_research, static_preview, or code_gen depending on stage). For request_work, pass `workItemIds` (e.g. the ids a static_preview_refine batch reported) to lease ONLY that batch — letting concurrent runs handle their own work in parallel; omit it (optionally with requestedLeaseCount) to lease the next ready items. A re-leased work item carrying `input.qaRetry` failed the diff QA gate — read the QA notes, edit the worktree until the diff shows CSS or markup changes, then report_work_item(kind=status) again (one retry max). static_preview is for fresh zero-to-one sessions and should return {html, css?, js?} so Rivet can show fast visual previews before Vite/code generation finishes.', contracts_1.continueVariantsInput, async (args) => {
510
367
  try {
511
368
  const stage = deps.orchestrator.getStage(args.sessionId);
512
369
  if (args.action === 'refine_variant') {
@@ -529,7 +386,7 @@ function registerAgentVariantsTools(mcp, deps) {
529
386
  if (stage === 'awaiting_briefs') {
530
387
  // continue_variants while still awaiting briefs means the agent
531
388
  // hasn't run the brief work item yet — that's a programming error.
532
- throw new errors_1.AgentVariantsError('INVALID_STAGE_ACTION', 'Run the brief work item and call report_variant_briefs before continue_variants');
389
+ throw new errors_1.AgentVariantsError('INVALID_STAGE_ACTION', "Run the brief work item and call report_work_item(kind='brief') before continue_variants");
533
390
  }
534
391
  if (stage === 'awaiting_approval') {
535
392
  const briefs = deps.orchestrator.getBriefs(args.sessionId);
@@ -602,15 +459,7 @@ function registerAgentVariantsTools(mcp, deps) {
602
459
  return errorResponse(err);
603
460
  }
604
461
  });
605
- registerVariantTool(mcp, 'report_variant_complete', "Agent reports per-work-item status: running (heartbeat), succeeded, failed, or cancelled. Requires a valid leaseId and matching attempt obtained from continue_variants(action='request_work'). " +
606
- 'For existing-project code_gen work items, verify the worktree diff includes CSS or markup changes before calling status="succeeded" — empty or deletion-only diffs fail QA and trigger a one-time re-lease. ' +
607
- 'OUTPUT SHAPE per work-item kind (see work item `output_schema` from start_variants / request_work):' +
608
- ' • static_preview: succeeded MUST pass output = { html: "<!doctype html>...", css?: "...", js?: "...", assetBase?: "<dir>" } — inline the full HTML; Rivet renders it directly in the iframe. Writing files to disk and reporting a file list does NOT work — the orchestrator never reads disk for the HTML.' +
609
- " If the HTML references sibling files (images, .glb, fonts), write those files to disk under a directory inside the work item's `input.projectContext.workspacePath` and pass that directory as `assetBase` (absolute or relative to workspacePath). Rivet then serves siblings from there at `/api/variants/.../static/<variantId>/<assetPath>`, so the HTML can use relative URLs like `./avatar.glb`. Omit `assetBase` if the HTML is fully self-contained." +
610
- ' For a forked Vary variant (input carries `sourceLabel`/`sourceBody` + `instruction`), ALSO pass `title` (≤ 6 words) and `description` (one sentence) that SYNTHESIZE the parent\'s identity with the requested change — e.g. parent "Icon grid" + instruction "make the hover red" → title "Icon grid — red hover", description "The 3-column icon grid with a red card-hover color." These become the variant card\'s name/description in place of the provisional label.' +
611
- " • code_gen / scaffold_base: succeeded passes the captured diff in the work item's `output` field as the agent's tool used (see the `output_schema` for that work item)." +
612
- ' For benchmark instrumentation, agents can optionally include tokensIn, tokensOut, and model in the call so Rivet can record cost per variant.' +
613
- ' ABORT: if the response is `{ aborted: true }`, the user removed or cancelled this direction while it was generating — stop this work item immediately, do NOT retry or re-report it, and move on to the others. For long generations, send periodic status="running" heartbeats so you pick up an abort early and avoid burning work on a direction that has already been dismissed.', contracts_1.reportVariantCompleteInput, async (args) => {
462
+ const handleReportComplete = async (args) => {
614
463
  try {
615
464
  const result = await deps.orchestrator.reportComplete({
616
465
  sessionId: args.sessionId,
@@ -693,9 +542,78 @@ function registerAgentVariantsTools(mcp, deps) {
693
542
  catch (err) {
694
543
  return errorResponse(err);
695
544
  }
545
+ };
546
+ registerVariantTool(mcp, 'report_work_item', 'Unified hand-back for a work item. `kind` selects the payload:\n' +
547
+ "• kind='brief' (brief work item) — pass `briefs` (one per direction) and optional `bindings`. Each brief: label = a 1–5 word plain-English title naming what THIS direction changes (describe the change, not the vibe — no marketing adjectives; a standalone title, never a \"Title — descriptor\" compound). body = one or two plain-English sentences describing the complete direction and the page scope it must preserve. Keep the original deliverable intact. On success every brief starts immediately (no in-chat approval gate) and the session lands in work_items_ready.\n" +
548
+ "• kind='source_plan' (source_plan work item) — pass `sourcePlan` { actions, metadata, bindings?, executionPlan }. Inspect raw userContext natively, choose actions from input.availableActions, and report the metadata they produce (extract_design_system → design_system, describe_motion → motion_guidance). For URL sources, call `capture_design_evidence({ sessionId, url })` FIRST and synthesize design_system.data.designMarkdown from that rendered evidence, setting data.evidenceStatus accordingly — Rivet rejects URL-backed design_system reports without a recorded capture_design_evidence attempt. Choose vite_app for large local assets / model-viewer / Three.js / route structure / package deps / files under public/; choose static_preview only when one HTML/CSS/JS file preserves the full scope. If ambiguous, set executionPlan.userQuestion instead of guessing. Unlocks the brief work item.\n" +
549
+ "• kind='status' (per-work-item status) — requires `leaseId` + `status` (running heartbeat | succeeded | failed | cancelled) with the matching `attempt` from continue_variants(action='request_work'). For existing-project code_gen items, verify the worktree diff includes CSS or markup changes before status=\"succeeded\" (empty/deletion-only diffs fail QA and trigger a one-time re-lease). OUTPUT SHAPE per work-item kind: static_preview succeeded MUST pass output = { html, css?, js?, assetBase? } — inline the full HTML (Rivet renders it directly; disk file lists do NOT work). If the HTML references sibling files, write them under a dir inside input.projectContext.workspacePath and pass that dir as assetBase. For a forked Vary variant (input carries sourceLabel/sourceBody + instruction) ALSO pass title (≤6 words) and description (one sentence) synthesizing the parent identity with the requested change. code_gen / scaffold_base succeeded passes the captured diff in output. Optionally include tokensIn/tokensOut/model for cost instrumentation. ABORT: if the response is { aborted: true }, the user removed this direction — stop immediately, do NOT retry, move on. Send periodic status=\"running\" heartbeats on long generations to pick up aborts early.\n" +
550
+ 'All kinds share the lease header { sessionId, workItemId, attempt }. Full protocol in the rivet skill.', contracts_1.reportWorkItemInput, async (args) => {
551
+ try {
552
+ if (args.kind === 'brief') {
553
+ if (!args.briefs || args.briefs.length === 0) {
554
+ throw new errors_1.AgentVariantsError('MISSING_REQUIRED_INPUT', "report_work_item(kind='brief') requires a non-empty briefs array");
555
+ }
556
+ return await handleReportBriefs({
557
+ sessionId: args.sessionId,
558
+ workItemId: args.workItemId,
559
+ attempt: args.attempt,
560
+ leaseId: args.leaseId,
561
+ briefs: args.briefs,
562
+ bindings: args.bindings,
563
+ });
564
+ }
565
+ if (args.kind === 'source_plan') {
566
+ if (!args.sourcePlan) {
567
+ throw new errors_1.AgentVariantsError('MISSING_REQUIRED_INPUT', "report_work_item(kind='source_plan') requires sourcePlan");
568
+ }
569
+ return await handleReportSourcePlan({
570
+ sessionId: args.sessionId,
571
+ workItemId: args.workItemId,
572
+ attempt: args.attempt,
573
+ leaseId: args.leaseId,
574
+ sourcePlan: args.sourcePlan,
575
+ });
576
+ }
577
+ // kind === 'status'
578
+ if (!args.leaseId || !args.status) {
579
+ throw new errors_1.AgentVariantsError('MISSING_REQUIRED_INPUT', "report_work_item(kind='status') requires leaseId and status");
580
+ }
581
+ return await handleReportComplete({
582
+ sessionId: args.sessionId,
583
+ workItemId: args.workItemId,
584
+ leaseId: args.leaseId,
585
+ attempt: args.attempt,
586
+ status: args.status,
587
+ output: args.output,
588
+ error: args.error,
589
+ tokensIn: args.tokensIn,
590
+ tokensOut: args.tokensOut,
591
+ model: args.model,
592
+ title: args.title,
593
+ description: args.description,
594
+ });
595
+ }
596
+ catch (err) {
597
+ return errorResponse(err);
598
+ }
696
599
  });
697
- registerVariantTool(mcp, 'cancel_variants', 'Cancel an in-flight variants session. Stops accepting new work, marks running items cancelled, and triggers cleanup.', contracts_1.cancelVariantsInput, async (args) => {
600
+ registerVariantTool(mcp, 'cancel_variants', 'Cancel variant work. Pass `variantId` to cancel ONLY that variant within an in-flight session (siblings keep generating) — idempotent on terminal states (already cancelled / succeeded / failed returns alreadyTerminal=true with the actual finalStatus); this is what the Rivet UI calls when the user clicks the cancel button on a variant card. Omit `variantId` to cancel the ENTIRE session — stops accepting new work, marks running items cancelled, and triggers cleanup. Per-variant worktree teardown happens at session commit/cancel time.', contracts_1.cancelVariantsInput, async (args) => {
698
601
  try {
602
+ if (args.variantId) {
603
+ const result = await deps.orchestrator.cancelVariant({
604
+ sessionId: args.sessionId,
605
+ variantId: args.variantId,
606
+ reason: args.reason,
607
+ });
608
+ const out = {
609
+ sessionId: result.sessionId,
610
+ variantId: result.variantId,
611
+ finalStatus: result.finalStatus,
612
+ sessionStage: result.sessionStage,
613
+ alreadyTerminal: result.alreadyTerminal,
614
+ };
615
+ return jsonResponse(out);
616
+ }
699
617
  const result = await deps.orchestrator.cancel({
700
618
  sessionId: args.sessionId,
701
619
  reason: args.reason,
@@ -735,6 +653,9 @@ function registerAgentVariantsTools(mcp, deps) {
735
653
  ? out.variants.length
736
654
  : undefined,
737
655
  });
656
+ // The user has now kicked off a variants run — retire the first-run
657
+ // onboarding nudge (idempotent; only the first call writes).
658
+ deps.markFirstVariantsRun?.();
738
659
  return jsonResponse(out);
739
660
  }
740
661
  catch (err) {
@@ -745,34 +666,70 @@ function registerAgentVariantsTools(mcp, deps) {
745
666
  return errorResponse(err);
746
667
  }
747
668
  });
748
- registerVariantTool(mcp, 'cancel_variant', 'Cancel a single variant within an in-flight session without affecting its siblings. Called by the Rivet UI when the user clicks the cancel button on a variant card. Marks the variant cancelled and frees its slot; sibling variants continue. Idempotent on terminal states (already cancelled / succeeded / failed returns alreadyTerminal=true with the actual finalStatus). Per-variant worktree teardown happens at session commit/cancel time. Distinct from cancel_variants (plural), which kills the entire session.', contracts_1.cancelVariantInput, async (args) => {
749
- try {
750
- const result = await deps.orchestrator.cancelVariant({
751
- sessionId: args.sessionId,
752
- variantId: args.variantId,
753
- reason: args.reason,
754
- });
755
- const out = {
756
- sessionId: result.sessionId,
757
- variantId: result.variantId,
758
- finalStatus: result.finalStatus,
759
- sessionStage: result.sessionStage,
760
- alreadyTerminal: result.alreadyTerminal,
761
- };
762
- return jsonResponse(out);
763
- }
764
- catch (err) {
765
- return errorResponse(err);
766
- }
767
- });
768
669
  const variantHistory = deps.variantHistory ?? new VariantHistoryService_1.VariantHistoryService();
769
- registerVariantTool(mcp, 'list_past_variants', "List previously generated variants for the current project from `<projectPath>/.rivet/variants/`. Sorted newest-first. Filter by `status` (completed | committed | rejected | cancelled) or cap with `limit`. Defaults to the active editor session's project path; falls back to the MCP server cwd when no editor is open.", contracts_1.listPastVariantsInput, async (args) => {
670
+ // Shared by the list and detail modes of list_past_variants. Defaulting to
671
+ // `process.cwd()` reads the wrong tree when the active visual editor is bound
672
+ // to a generated project folder, so prefer the editor's project path.
673
+ const resolveHistoryProjectPath = (projectPathArg) => {
674
+ const projectPath = projectPathArg ?? deps.getProjectPath?.() ?? process.cwd();
675
+ if (!path_1.default.isAbsolute(projectPath)) {
676
+ throw new errors_1.AgentVariantsError('SCHEMA_VALIDATION_FAILED', `projectPath must be absolute; got '${projectPath}'.`);
677
+ }
678
+ return projectPath;
679
+ };
680
+ registerVariantTool(mcp, 'list_past_variants', "Read persisted variants for the current project from `<projectPath>/.rivet/variants/`. LIST mode (default): returns a newest-first summary list — filter by `status` (completed | committed | rejected | cancelled) or cap with `limit`. DETAIL mode: pass BOTH `sessionId` and `variantId` to fetch one variant's manifest plus its diff body (kind=diff) or file list (kind=project-created); pass `includeBody: false` to skip the diff/file list when you just need metadata. Defaults to the active editor session's project path; falls back to the MCP server cwd when no editor is open.", contracts_1.listPastVariantsInput, async (args) => {
770
681
  try {
771
- // Defaulting to `process.cwd()` reads the wrong tree when the active
772
- // visual editor is bound to a generated project folder.
773
- const projectPath = args.projectPath ?? deps.getProjectPath?.() ?? process.cwd();
774
- if (!path_1.default.isAbsolute(projectPath)) {
775
- throw new errors_1.AgentVariantsError('SCHEMA_VALIDATION_FAILED', `projectPath must be absolute; got '${projectPath}'.`);
682
+ const projectPath = resolveHistoryProjectPath(args.projectPath);
683
+ // DETAIL mode (merged from the former get_variant tool): both
684
+ // sessionId and variantId identify a single persisted variant.
685
+ if (args.sessionId || args.variantId) {
686
+ if (!args.sessionId || !args.variantId) {
687
+ throw new errors_1.AgentVariantsError('MISSING_REQUIRED_INPUT', 'Detail mode requires both sessionId and variantId; omit both for the newest-first list.');
688
+ }
689
+ const detail = await variantHistory.getVariant({
690
+ projectPath,
691
+ sessionId: args.sessionId,
692
+ variantId: args.variantId,
693
+ });
694
+ if (!detail) {
695
+ throw new errors_1.AgentVariantsError('WORK_ITEM_NOT_FOUND', `No persisted variant for session ${args.sessionId} variant ${args.variantId} under ${projectPath}/.rivet/variants/.`);
696
+ }
697
+ const includeBody = args.includeBody !== false;
698
+ const detailOut = {
699
+ projectPath,
700
+ variant: {
701
+ sessionId: detail.manifest.sessionId,
702
+ variantId: detail.manifest.variantId,
703
+ ...(detail.manifest.requestId
704
+ ? { requestId: detail.manifest.requestId }
705
+ : {}),
706
+ label: detail.manifest.label,
707
+ brief: detail.manifest.brief,
708
+ kind: manifestKind(detail.manifest),
709
+ status: detail.manifest.status,
710
+ createdAt: detail.manifest.createdAt,
711
+ statusChangedAt: detail.manifest.statusChangedAt,
712
+ changedFilesCount: detail.manifest.changedFilesCount,
713
+ sessionPrompt: detail.manifest.sessionPrompt,
714
+ baseSha: detail.manifest.baseSha,
715
+ destinationPath: detail.manifest.destinationPath,
716
+ artifact: detail.manifest.artifact,
717
+ preview: detail.manifest.preview,
718
+ ...(detail.manifest.designSource
719
+ ? { designSource: detail.manifest.designSource }
720
+ : {}),
721
+ ...(includeBody && detail.diff !== undefined
722
+ ? { diff: detail.diff }
723
+ : {}),
724
+ ...(includeBody && detail.files !== undefined
725
+ ? { files: detail.files }
726
+ : {}),
727
+ ...(includeBody && detail.designMarkdown !== undefined
728
+ ? { designMarkdown: detail.designMarkdown }
729
+ : {}),
730
+ },
731
+ };
732
+ return jsonResponse(detailOut);
776
733
  }
777
734
  const entries = await variantHistory.listVariants({
778
735
  projectPath,
@@ -813,61 +770,6 @@ function registerAgentVariantsTools(mcp, deps) {
813
770
  return errorResponse(err);
814
771
  }
815
772
  });
816
- registerVariantTool(mcp, 'get_variant', "Fetch one prior variant by sessionId + variantId from `<projectPath>/.rivet/variants/`. Returns the manifest plus the diff body (for kind=diff) or the file list (for kind=project-created). Pass `includeBody: false` to skip the diff/file list when you just need metadata. Defaults to the active editor session's project path; falls back to the MCP server cwd when no editor is open.", contracts_1.getVariantInput, async (args) => {
817
- try {
818
- const projectPath = args.projectPath ?? deps.getProjectPath?.() ?? process.cwd();
819
- if (!path_1.default.isAbsolute(projectPath)) {
820
- throw new errors_1.AgentVariantsError('SCHEMA_VALIDATION_FAILED', `projectPath must be absolute; got '${projectPath}'.`);
821
- }
822
- const detail = await variantHistory.getVariant({
823
- projectPath,
824
- sessionId: args.sessionId,
825
- variantId: args.variantId,
826
- });
827
- if (!detail) {
828
- throw new errors_1.AgentVariantsError('WORK_ITEM_NOT_FOUND', `No persisted variant for session ${args.sessionId} variant ${args.variantId} under ${projectPath}/.rivet/variants/.`);
829
- }
830
- const includeBody = args.includeBody !== false;
831
- const out = {
832
- projectPath,
833
- variant: {
834
- sessionId: detail.manifest.sessionId,
835
- variantId: detail.manifest.variantId,
836
- ...(detail.manifest.requestId
837
- ? { requestId: detail.manifest.requestId }
838
- : {}),
839
- label: detail.manifest.label,
840
- brief: detail.manifest.brief,
841
- kind: manifestKind(detail.manifest),
842
- status: detail.manifest.status,
843
- createdAt: detail.manifest.createdAt,
844
- statusChangedAt: detail.manifest.statusChangedAt,
845
- changedFilesCount: detail.manifest.changedFilesCount,
846
- sessionPrompt: detail.manifest.sessionPrompt,
847
- baseSha: detail.manifest.baseSha,
848
- destinationPath: detail.manifest.destinationPath,
849
- artifact: detail.manifest.artifact,
850
- preview: detail.manifest.preview,
851
- ...(detail.manifest.designSource
852
- ? { designSource: detail.manifest.designSource }
853
- : {}),
854
- ...(includeBody && detail.diff !== undefined
855
- ? { diff: detail.diff }
856
- : {}),
857
- ...(includeBody && detail.files !== undefined
858
- ? { files: detail.files }
859
- : {}),
860
- ...(includeBody && detail.designMarkdown !== undefined
861
- ? { designMarkdown: detail.designMarkdown }
862
- : {}),
863
- },
864
- };
865
- return jsonResponse(out);
866
- }
867
- catch (err) {
868
- return errorResponse(err);
869
- }
870
- });
871
773
  }
872
774
  // --- Helpers --------------------------------------------------------------
873
775
  // Return type is left implicit so the MCP SDK's overload selection picks the
@@ -984,7 +886,7 @@ function buildRegeneratePrompt(label, qa) {
984
886
  return (`${name} did not pass the QA gate and was re-queued for ONE regeneration — ` +
985
887
  'it is no longer counted as done. Call ' +
986
888
  "continue_variants(action='request_work') to re-lease it (it carries the " +
987
- 'QA notes on its input), address the feedback, then report_variant_complete ' +
889
+ "QA notes on its input), address the feedback, then report_work_item(kind='status') " +
988
890
  `again. This is its only retry.${notes}`);
989
891
  }
990
892
  const describeIssue = (kind) => {
@@ -1257,7 +1159,7 @@ function assembleStartVariantsResponse(args) {
1257
1159
  ...(args.pendingVariantRequests !== undefined
1258
1160
  ? { pendingVariantRequests: args.pendingVariantRequests }
1259
1161
  : {}),
1260
- nextAction: 'report_variant_complete',
1162
+ nextAction: 'report_work_item',
1261
1163
  };
1262
1164
  }
1263
1165
  //# sourceMappingURL=tools.js.map