rivet-design 0.10.9 → 0.11.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 (91) hide show
  1. package/dist/mcp/agent-variants/SessionStore.d.ts +6 -4
  2. package/dist/mcp/agent-variants/SessionStore.d.ts.map +1 -1
  3. package/dist/mcp/agent-variants/SessionStore.js +314 -123
  4. package/dist/mcp/agent-variants/SessionStore.js.map +1 -1
  5. package/dist/mcp/agent-variants/WorktreeOrchestrator.d.ts +9 -2
  6. package/dist/mcp/agent-variants/WorktreeOrchestrator.d.ts.map +1 -1
  7. package/dist/mcp/agent-variants/WorktreeOrchestrator.js +60 -42
  8. package/dist/mcp/agent-variants/WorktreeOrchestrator.js.map +1 -1
  9. package/dist/mcp/agent-variants/WorktreeOrchestrator.testHelpers.d.ts +1 -1
  10. package/dist/mcp/agent-variants/WorktreeOrchestrator.testHelpers.d.ts.map +1 -1
  11. package/dist/mcp/agent-variants/WorktreeOrchestrator.testHelpers.js +1 -1
  12. package/dist/mcp/agent-variants/WorktreeOrchestrator.testHelpers.js.map +1 -1
  13. package/dist/mcp/agent-variants/contracts.d.ts +7712 -2283
  14. package/dist/mcp/agent-variants/contracts.d.ts.map +1 -1
  15. package/dist/mcp/agent-variants/contracts.js +302 -152
  16. package/dist/mcp/agent-variants/contracts.js.map +1 -1
  17. package/dist/mcp/agent-variants/createZeroToOneTool.d.ts +2 -3
  18. package/dist/mcp/agent-variants/createZeroToOneTool.d.ts.map +1 -1
  19. package/dist/mcp/agent-variants/createZeroToOneTool.js +49 -39
  20. package/dist/mcp/agent-variants/createZeroToOneTool.js.map +1 -1
  21. package/dist/mcp/agent-variants/designCritique.d.ts +7 -3
  22. package/dist/mcp/agent-variants/designCritique.d.ts.map +1 -1
  23. package/dist/mcp/agent-variants/designCritique.js +12 -5
  24. package/dist/mcp/agent-variants/designCritique.js.map +1 -1
  25. package/dist/mcp/agent-variants/index.d.ts +1 -1
  26. package/dist/mcp/agent-variants/index.d.ts.map +1 -1
  27. package/dist/mcp/agent-variants/pinterestSourceContext.d.ts +4 -2
  28. package/dist/mcp/agent-variants/pinterestSourceContext.d.ts.map +1 -1
  29. package/dist/mcp/agent-variants/pinterestSourceContext.js +7 -6
  30. package/dist/mcp/agent-variants/pinterestSourceContext.js.map +1 -1
  31. package/dist/mcp/agent-variants/previewQa.d.ts +6 -4
  32. package/dist/mcp/agent-variants/previewQa.d.ts.map +1 -1
  33. package/dist/mcp/agent-variants/previewQa.js +133 -13
  34. package/dist/mcp/agent-variants/previewQa.js.map +1 -1
  35. package/dist/mcp/agent-variants/sourceContext.d.ts +20 -5
  36. package/dist/mcp/agent-variants/sourceContext.d.ts.map +1 -1
  37. package/dist/mcp/agent-variants/sourceContext.js +99 -115
  38. package/dist/mcp/agent-variants/sourceContext.js.map +1 -1
  39. package/dist/mcp/agent-variants/tools.d.ts +7 -0
  40. package/dist/mcp/agent-variants/tools.d.ts.map +1 -1
  41. package/dist/mcp/agent-variants/tools.js +209 -16
  42. package/dist/mcp/agent-variants/tools.js.map +1 -1
  43. package/dist/mcp/agent-variants/variantContext.d.ts +19 -0
  44. package/dist/mcp/agent-variants/variantContext.d.ts.map +1 -0
  45. package/dist/mcp/agent-variants/variantContext.js +355 -0
  46. package/dist/mcp/agent-variants/variantContext.js.map +1 -0
  47. package/dist/mcp/server.d.ts.map +1 -1
  48. package/dist/mcp/server.js +4 -2
  49. package/dist/mcp/server.js.map +1 -1
  50. package/dist/routes/agentVariants.js +4 -3
  51. package/dist/routes/agentVariants.js.map +1 -1
  52. package/dist/services/BrowserAgentClient.d.ts +54 -0
  53. package/dist/services/BrowserAgentClient.d.ts.map +1 -0
  54. package/dist/services/BrowserAgentClient.js +126 -0
  55. package/dist/services/BrowserAgentClient.js.map +1 -0
  56. package/dist/services/InlineVariantGenerationService.d.ts +2 -0
  57. package/dist/services/InlineVariantGenerationService.d.ts.map +1 -1
  58. package/dist/services/InlineVariantGenerationService.js +70 -3
  59. package/dist/services/InlineVariantGenerationService.js.map +1 -1
  60. package/dist/services/VariantRunService.d.ts +1 -0
  61. package/dist/services/VariantRunService.d.ts.map +1 -1
  62. package/dist/services/VariantRunService.js +1 -0
  63. package/dist/services/VariantRunService.js.map +1 -1
  64. package/dist/services/VariantsRuntime.d.ts.map +1 -1
  65. package/dist/services/VariantsRuntime.js +1 -0
  66. package/dist/services/VariantsRuntime.js.map +1 -1
  67. package/dist/services/WorktreeManager.d.ts +1 -8
  68. package/dist/services/WorktreeManager.d.ts.map +1 -1
  69. package/dist/services/WorktreeManager.js +1 -28
  70. package/dist/services/WorktreeManager.js.map +1 -1
  71. package/dist/utils/skills/describe-motion-protocol.d.ts +2 -3
  72. package/dist/utils/skills/describe-motion-protocol.d.ts.map +1 -1
  73. package/dist/utils/skills/describe-motion-protocol.js +50 -35
  74. package/dist/utils/skills/describe-motion-protocol.js.map +1 -1
  75. package/dist/utils/skills/shared-variants-protocol.d.ts +1 -1
  76. package/dist/utils/skills/shared-variants-protocol.d.ts.map +1 -1
  77. package/dist/utils/skills/shared-variants-protocol.js +16 -13
  78. package/dist/utils/skills/shared-variants-protocol.js.map +1 -1
  79. package/package.json +2 -1
  80. package/src/ui/dist/assets/{main-Cwwhwfjq.js → main-Cw6Pd8ye.js} +56 -56
  81. package/src/ui/dist/assets/main-DkCj7b2K.css +1 -0
  82. package/src/ui/dist/index.html +2 -2
  83. package/dist/mcp/agent-variants/designContextStore.d.ts +0 -160
  84. package/dist/mcp/agent-variants/designContextStore.d.ts.map +0 -1
  85. package/dist/mcp/agent-variants/designContextStore.js +0 -295
  86. package/dist/mcp/agent-variants/designContextStore.js.map +0 -1
  87. package/dist/mcp/agent-variants/inspirationDesignContext.d.ts +0 -440
  88. package/dist/mcp/agent-variants/inspirationDesignContext.d.ts.map +0 -1
  89. package/dist/mcp/agent-variants/inspirationDesignContext.js +0 -2467
  90. package/dist/mcp/agent-variants/inspirationDesignContext.js.map +0 -1
  91. package/src/ui/dist/assets/main-Do6whVIm.css +0 -1
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ERROR_CODES = exports.getVariantInput = exports.listPastVariantsInput = exports.variantHistoryStatusSchema = exports.startVariantsInput = exports.startVariantsBriefContent = exports.startVariantsMode = exports.cancelVariantInput = exports.cancelVariantsInput = exports.extractInspirationContextInput = exports.reportVariantCompleteInput = exports.reportVariantCompleteStatus = exports.continueVariantsInput = exports.continueVariantsAction = exports.commitVariantInput = exports.approveVariantBriefsInput = exports.reportSourcePlanInput = exports.sourcePlanArtifactSchema = exports.reportVariantBriefsInput = exports.proposeVariantsInput = exports.runLabelSchema = exports.VARIANT_COUNT_MAX = exports.VARIANT_COUNT_MIN = exports.briefSchema = exports.targetSchema = exports.VARIANT_ARTIFACT_KINDS = exports.projectContextSchema = exports.projectContextFresh = exports.projectContextExisting = exports.executionCapabilityPlanSchema = exports.assetPlanEntrySchema = exports.executionConfidenceSchema = exports.executionModeSchema = exports.sourceContextInputSchema = exports.sourceContextArtifactSchema = exports.sourceRoleEntrySchema = exports.sourceRoleSchema = exports.sourceArtifactInputSchema = exports.sourceArtifactKindSchema = exports.designContextEntrySchema = exports.sourceIntentArtifactSchema = exports.sourceIntentEntrySchema = exports.sourceIntentConfidenceSchema = exports.sourceIntentRoleSchema = exports.WORK_ITEM_STATUSES = exports.WORK_ITEM_KINDS = exports.TERMINAL_STAGES = exports.STAGES = void 0;
3
+ exports.ERROR_CODES = exports.getVariantInput = exports.captureDesignEvidenceInput = exports.listPastVariantsInput = exports.variantHistoryStatusSchema = exports.startVariantsInput = exports.startVariantsBriefContent = exports.startVariantsMode = exports.cancelVariantInput = exports.cancelVariantsInput = exports.reportVariantCompleteInput = exports.reportVariantCompleteStatus = exports.continueVariantsInput = exports.continueVariantsAction = exports.commitVariantInput = exports.approveVariantBriefsInput = exports.reportSourcePlanInput = exports.sourcePlanArtifactSchema = exports.reportVariantBriefsInput = exports.proposeVariantsInput = exports.runLabelSchema = exports.VARIANT_COUNT_MAX = exports.VARIANT_COUNT_MIN = exports.variantWorkItemContextSchema = exports.briefSchema = exports.targetSchema = exports.VARIANT_ARTIFACT_KINDS = exports.projectContextInputSchema = exports.projectContextSchema = exports.projectContextFresh = exports.projectContextExisting = exports.variantContextBundleSchema = exports.executionCapabilityPlanSchema = exports.assetPlanEntrySchema = exports.executionConfidenceSchema = exports.executionModeSchema = exports.variantContextBindingSchema = exports.rivetMetadataSchema = exports.sourcePlanActionOptionSchema = exports.rivetContextActionSchema = exports.rivetContextActionKindSchema = exports.storedUserContextSourceRecordSchema = exports.rawUserContextSourceSchema = exports.rawUserContextInputSchema = exports.sourceRoleSchema = exports.designContextEntrySchema = exports.WORK_ITEM_STATUSES = exports.WORK_ITEM_KINDS = exports.TERMINAL_STAGES = exports.STAGES = void 0;
4
4
  const v3_1 = require("zod/v3");
5
5
  const errors_1 = require("./errors");
6
6
  Object.defineProperty(exports, "ERROR_CODES", { enumerable: true, get: function () { return errors_1.ERROR_CODES; } });
7
- const inspirationDesignContext_1 = require("./inspirationDesignContext");
7
+ const sourceContext_1 = require("./sourceContext");
8
8
  // --- Stages ---------------------------------------------------------------
9
9
  exports.STAGES = [
10
10
  'awaiting_source_plan',
@@ -44,43 +44,13 @@ exports.WORK_ITEM_STATUSES = [
44
44
  const DESIGN_CONTEXT_MARKDOWN_MAX_LENGTH = 50_000;
45
45
  const DESIGN_CONTEXT_SLUG_MAX_LENGTH = 120;
46
46
  const SOURCE_URL_MAX_LENGTH = 2_048;
47
- const SOURCE_ARTIFACT_LABEL_MAX_LENGTH = 80;
48
- const SOURCE_ARTIFACT_CONTENT_MAX_LENGTH = 8_000;
49
47
  const SOURCE_FINDING_MAX_LENGTH = 400;
50
48
  const SOURCE_LIST_MAX_ITEMS = 24;
51
- const SOURCE_SCREENSHOT_MAX_ITEMS = 16;
52
- // --- Source intent ---------------------------------------------------------
53
- exports.sourceIntentRoleSchema = v3_1.z.enum([
54
- 'design_source',
55
- 'interaction_reference',
56
- 'asset_source',
57
- 'content_reference',
58
- 'other',
59
- ]);
60
- exports.sourceIntentConfidenceSchema = v3_1.z.enum(['low', 'medium', 'high']);
61
- /**
62
- * One classified source in the agent's `sourceIntent`. Identified by exactly
63
- * one of:
64
- * - `url`: an inspiration URL the user provided
65
- * - `imageRef`: a stable per-session reference of the form `image:<index>`
66
- * pointing at an image-kind entry in `sourceArtifacts` (visualBrief or
67
- * screenshotNotes). Indexed over image-kind artifacts only, so the ref
68
- * survives reordering of text-only artifacts.
69
- */
70
- exports.sourceIntentEntrySchema = v3_1.z
71
- .object({
72
- url: v3_1.z.string().min(1).max(SOURCE_URL_MAX_LENGTH).optional(),
73
- imageRef: v3_1.z.string().min(1).max(64).optional(),
74
- role: exports.sourceIntentRoleSchema,
75
- confidence: exports.sourceIntentConfidenceSchema,
76
- reason: v3_1.z.string().min(1).max(SOURCE_FINDING_MAX_LENGTH),
77
- })
78
- .refine((entry) => Boolean(entry.url) !== Boolean(entry.imageRef), {
79
- message: 'sourceIntent entry must specify exactly one of `url` or `imageRef`.',
80
- });
81
- exports.sourceIntentArtifactSchema = v3_1.z.object({
82
- sources: v3_1.z.array(exports.sourceIntentEntrySchema).min(1).max(SOURCE_LIST_MAX_ITEMS),
83
- });
49
+ const USER_CONTEXT_LABEL_MAX_LENGTH = 80;
50
+ const USER_CONTEXT_TEXT_MAX_LENGTH = 50_000;
51
+ const USER_CONTEXT_PATH_MAX_LENGTH = 2_048;
52
+ const USER_CONTEXT_UPLOAD_DATA_URL_MAX_LENGTH = 70_000_000;
53
+ // --- Design context --------------------------------------------------------
84
54
  exports.designContextEntrySchema = v3_1.z.discriminatedUnion('kind', [
85
55
  v3_1.z.object({
86
56
  kind: v3_1.z.literal('slug'),
@@ -92,69 +62,232 @@ exports.designContextEntrySchema = v3_1.z.discriminatedUnion('kind', [
92
62
  label: v3_1.z.string().min(1).max(60),
93
63
  }),
94
64
  ]);
95
- exports.sourceArtifactKindSchema = v3_1.z.enum([
96
- 'urlText',
97
- 'siteBrief',
98
- 'visualBrief',
99
- 'screenshotNotes',
100
- 'motionBrief',
101
- ]);
102
- exports.sourceArtifactInputSchema = v3_1.z.object({
103
- kind: exports.sourceArtifactKindSchema,
104
- label: v3_1.z.string().min(1).max(SOURCE_ARTIFACT_LABEL_MAX_LENGTH),
105
- content: v3_1.z.string().min(1).max(SOURCE_ARTIFACT_CONTENT_MAX_LENGTH),
106
- });
65
+ /**
66
+ * Role a raw source plays in `design_system` action metadata. Retained because
67
+ * `rivetMetadataSchema` references it; the legacy summary-first
68
+ * `sourceContext`/`sourceIntent` intake shapes that also used it are gone.
69
+ */
107
70
  exports.sourceRoleSchema = v3_1.z.enum([
108
71
  'primary',
109
72
  'inspiration',
110
73
  'competitor',
111
74
  ]);
112
- exports.sourceRoleEntrySchema = v3_1.z.object({
113
- url: v3_1.z.string().min(1).max(SOURCE_URL_MAX_LENGTH),
114
- role: exports.sourceRoleSchema,
115
- rationale: v3_1.z.string().min(1).max(SOURCE_FINDING_MAX_LENGTH).optional(),
116
- });
117
- exports.sourceContextArtifactSchema = v3_1.z.object({
118
- sourceFindings: v3_1.z
119
- .array(v3_1.z.string().min(1).max(SOURCE_FINDING_MAX_LENGTH))
120
- .min(1)
121
- .max(SOURCE_LIST_MAX_ITEMS),
122
- sectionInventory: v3_1.z
123
- .array(v3_1.z.string().min(1).max(SOURCE_FINDING_MAX_LENGTH))
124
- .min(1)
125
- .max(SOURCE_LIST_MAX_ITEMS),
126
- visualObservations: v3_1.z
127
- .array(v3_1.z.string().min(1).max(SOURCE_FINDING_MAX_LENGTH))
128
- .min(1)
129
- .max(SOURCE_LIST_MAX_ITEMS),
130
- sourceRoles: v3_1.z.array(exports.sourceRoleEntrySchema).min(1).max(SOURCE_LIST_MAX_ITEMS),
131
- qualityBar: v3_1.z
132
- .array(v3_1.z.string().min(1).max(SOURCE_FINDING_MAX_LENGTH))
133
- .min(1)
134
- .max(SOURCE_LIST_MAX_ITEMS),
135
- screenshotReferences: v3_1.z
136
- .array(v3_1.z.string().min(1).max(SOURCE_FINDING_MAX_LENGTH))
137
- .max(SOURCE_SCREENSHOT_MAX_ITEMS)
138
- .optional(),
139
- risks: v3_1.z
140
- .array(v3_1.z.string().min(1).max(SOURCE_FINDING_MAX_LENGTH))
141
- .max(SOURCE_LIST_MAX_ITEMS)
75
+ // --- Native user context ---------------------------------------------------
76
+ exports.rawUserContextInputSchema = v3_1.z.discriminatedUnion('transport', [
77
+ v3_1.z.object({
78
+ transport: v3_1.z.literal('url'),
79
+ url: v3_1.z.string().min(1).max(SOURCE_URL_MAX_LENGTH),
80
+ label: v3_1.z.string().min(1).max(USER_CONTEXT_LABEL_MAX_LENGTH).optional(),
81
+ userIntent: v3_1.z.string().min(1).max(SOURCE_FINDING_MAX_LENGTH).optional(),
82
+ }),
83
+ v3_1.z.object({
84
+ transport: v3_1.z.literal('file_path'),
85
+ path: v3_1.z.string().min(1).max(USER_CONTEXT_PATH_MAX_LENGTH),
86
+ mimeType: v3_1.z.string().min(1).max(120).optional(),
87
+ label: v3_1.z.string().min(1).max(USER_CONTEXT_LABEL_MAX_LENGTH).optional(),
88
+ userIntent: v3_1.z.string().min(1).max(SOURCE_FINDING_MAX_LENGTH).optional(),
89
+ }),
90
+ v3_1.z.object({
91
+ transport: v3_1.z.literal('upload'),
92
+ dataUrl: v3_1.z.string().min(1).max(USER_CONTEXT_UPLOAD_DATA_URL_MAX_LENGTH),
93
+ filename: v3_1.z.string().min(1).max(USER_CONTEXT_LABEL_MAX_LENGTH).optional(),
94
+ label: v3_1.z.string().min(1).max(USER_CONTEXT_LABEL_MAX_LENGTH).optional(),
95
+ userIntent: v3_1.z.string().min(1).max(SOURCE_FINDING_MAX_LENGTH).optional(),
96
+ }),
97
+ v3_1.z.object({
98
+ transport: v3_1.z.literal('directory_path'),
99
+ path: v3_1.z.string().min(1).max(USER_CONTEXT_PATH_MAX_LENGTH),
100
+ label: v3_1.z.string().min(1).max(USER_CONTEXT_LABEL_MAX_LENGTH).optional(),
101
+ userIntent: v3_1.z.string().min(1).max(SOURCE_FINDING_MAX_LENGTH).optional(),
102
+ }),
103
+ v3_1.z.object({
104
+ transport: v3_1.z.literal('text'),
105
+ content: v3_1.z.string().min(1).max(USER_CONTEXT_TEXT_MAX_LENGTH),
106
+ label: v3_1.z.string().min(1).max(USER_CONTEXT_LABEL_MAX_LENGTH).optional(),
107
+ userIntent: v3_1.z.string().min(1).max(SOURCE_FINDING_MAX_LENGTH).optional(),
108
+ }),
109
+ ]);
110
+ exports.rawUserContextSourceSchema = v3_1.z.discriminatedUnion('transport', [
111
+ v3_1.z.object({
112
+ id: v3_1.z.string().min(1),
113
+ transport: v3_1.z.literal('prompt'),
114
+ path: v3_1.z.string().min(1).max(USER_CONTEXT_PATH_MAX_LENGTH),
115
+ }),
116
+ v3_1.z.object({
117
+ id: v3_1.z.string().min(1),
118
+ transport: v3_1.z.literal('url'),
119
+ url: v3_1.z.string().min(1).max(SOURCE_URL_MAX_LENGTH),
120
+ label: v3_1.z.string().min(1).max(USER_CONTEXT_LABEL_MAX_LENGTH).optional(),
121
+ userIntent: v3_1.z.string().min(1).max(SOURCE_FINDING_MAX_LENGTH).optional(),
122
+ }),
123
+ v3_1.z.object({
124
+ id: v3_1.z.string().min(1),
125
+ transport: v3_1.z.literal('file'),
126
+ path: v3_1.z.string().min(1).max(USER_CONTEXT_PATH_MAX_LENGTH),
127
+ mimeType: v3_1.z.string().min(1).max(120).optional(),
128
+ originalFilename: v3_1.z
129
+ .string()
130
+ .min(1)
131
+ .max(USER_CONTEXT_LABEL_MAX_LENGTH)
132
+ .optional(),
133
+ label: v3_1.z.string().min(1).max(USER_CONTEXT_LABEL_MAX_LENGTH).optional(),
134
+ userIntent: v3_1.z.string().min(1).max(SOURCE_FINDING_MAX_LENGTH).optional(),
135
+ }),
136
+ v3_1.z.object({
137
+ id: v3_1.z.string().min(1),
138
+ transport: v3_1.z.literal('directory'),
139
+ path: v3_1.z.string().min(1).max(USER_CONTEXT_PATH_MAX_LENGTH),
140
+ label: v3_1.z.string().min(1).max(USER_CONTEXT_LABEL_MAX_LENGTH).optional(),
141
+ userIntent: v3_1.z.string().min(1).max(SOURCE_FINDING_MAX_LENGTH).optional(),
142
+ }),
143
+ v3_1.z.object({
144
+ id: v3_1.z.string().min(1),
145
+ transport: v3_1.z.literal('text'),
146
+ path: v3_1.z.string().min(1).max(USER_CONTEXT_PATH_MAX_LENGTH),
147
+ label: v3_1.z.string().min(1).max(USER_CONTEXT_LABEL_MAX_LENGTH).optional(),
148
+ userIntent: v3_1.z.string().min(1).max(SOURCE_FINDING_MAX_LENGTH).optional(),
149
+ }),
150
+ ]);
151
+ exports.storedUserContextSourceRecordSchema = v3_1.z.object({
152
+ source: exports.rawUserContextSourceSchema,
153
+ storage: v3_1.z
154
+ .object({
155
+ sizeBytes: v3_1.z.number().int().nonnegative().optional(),
156
+ sha256: v3_1.z.string().min(1).optional(),
157
+ originalFilename: v3_1.z.string().min(1).optional(),
158
+ })
142
159
  .optional(),
143
160
  });
144
- exports.sourceContextInputSchema = v3_1.z.object({
145
- sourceUrls: v3_1.z
146
- .array(v3_1.z.string().min(1).max(SOURCE_URL_MAX_LENGTH))
161
+ exports.rivetContextActionKindSchema = v3_1.z.enum([
162
+ 'extract_design_system',
163
+ 'describe_motion',
164
+ ]);
165
+ exports.rivetContextActionSchema = v3_1.z.object({
166
+ id: v3_1.z.string().min(1),
167
+ kind: exports.rivetContextActionKindSchema,
168
+ sourceIds: v3_1.z.array(v3_1.z.string().min(1)).max(SOURCE_LIST_MAX_ITEMS),
169
+ reason: v3_1.z.string().min(1).max(SOURCE_FINDING_MAX_LENGTH),
170
+ outputMetadataIds: v3_1.z
171
+ .array(v3_1.z.string().min(1))
147
172
  .max(SOURCE_LIST_MAX_ITEMS)
148
173
  .optional(),
149
- preserveBrand: v3_1.z.boolean().optional(),
150
- sourceArtifacts: v3_1.z
151
- .array(exports.sourceArtifactInputSchema)
174
+ });
175
+ exports.sourcePlanActionOptionSchema = v3_1.z.object({
176
+ kind: exports.rivetContextActionKindSchema,
177
+ sourceTransports: v3_1.z
178
+ .array(v3_1.z.enum(['prompt', 'url', 'file', 'directory', 'text']))
179
+ .min(1)
180
+ .max(SOURCE_LIST_MAX_ITEMS),
181
+ capability: v3_1.z.enum(['extract_inspiration_context', 'rivet_describe_motion']),
182
+ produces: v3_1.z.enum(['design_system', 'motion_guidance']),
183
+ instructions: v3_1.z.string().min(1).max(SOURCE_FINDING_MAX_LENGTH),
184
+ });
185
+ const rivetMetadataBaseSchema = v3_1.z.object({
186
+ id: v3_1.z.string().min(1),
187
+ sourceIds: v3_1.z.array(v3_1.z.string().min(1)).max(SOURCE_LIST_MAX_ITEMS),
188
+ actionId: v3_1.z.string().min(1).optional(),
189
+ producedBy: v3_1.z.enum(['rivet', 'agent', 'browser', 'skill']),
190
+ path: v3_1.z.string().min(1).max(USER_CONTEXT_PATH_MAX_LENGTH).optional(),
191
+ warnings: v3_1.z
192
+ .array(v3_1.z.string().min(1).max(SOURCE_FINDING_MAX_LENGTH))
152
193
  .max(SOURCE_LIST_MAX_ITEMS)
153
194
  .optional(),
154
- artifact: exports.sourceContextArtifactSchema.optional(),
155
- sourceIntent: exports.sourceIntentArtifactSchema.optional(),
156
- designDecision: v3_1.z.enum(['let_rivet_choose', 'go_custom']).optional(),
157
195
  });
196
+ exports.rivetMetadataSchema = v3_1.z.discriminatedUnion('kind', [
197
+ rivetMetadataBaseSchema.extend({
198
+ kind: v3_1.z.literal('design_system'),
199
+ data: v3_1.z.object({
200
+ designMarkdown: v3_1.z
201
+ .string()
202
+ .min(1)
203
+ .max(DESIGN_CONTEXT_MARKDOWN_MAX_LENGTH)
204
+ .optional(),
205
+ /**
206
+ * Provenance for the design system: `captured` = derived from rendered
207
+ * browser evidence (e.g. `capture_design_evidence`); `partial` = some
208
+ * evidence, gaps filled by inference; `inferred` = no rendered evidence
209
+ * (static fetch / native inspection only). Keeps DESIGN.md honest about
210
+ * extracted-vs-guessed values.
211
+ */
212
+ evidenceStatus: v3_1.z.enum(['captured', 'partial', 'inferred']).optional(),
213
+ sourceFindings: v3_1.z
214
+ .array(v3_1.z.string().min(1).max(SOURCE_FINDING_MAX_LENGTH))
215
+ .min(1)
216
+ .max(SOURCE_LIST_MAX_ITEMS),
217
+ sectionInventory: v3_1.z
218
+ .array(v3_1.z.string().min(1).max(SOURCE_FINDING_MAX_LENGTH))
219
+ .min(1)
220
+ .max(SOURCE_LIST_MAX_ITEMS),
221
+ visualObservations: v3_1.z
222
+ .array(v3_1.z.string().min(1).max(SOURCE_FINDING_MAX_LENGTH))
223
+ .min(1)
224
+ .max(SOURCE_LIST_MAX_ITEMS),
225
+ sourceRoles: v3_1.z
226
+ .array(v3_1.z.object({
227
+ sourceId: v3_1.z.string().min(1),
228
+ role: exports.sourceRoleSchema,
229
+ rationale: v3_1.z
230
+ .string()
231
+ .min(1)
232
+ .max(SOURCE_FINDING_MAX_LENGTH)
233
+ .optional(),
234
+ }))
235
+ .min(1)
236
+ .max(SOURCE_LIST_MAX_ITEMS),
237
+ qualityBar: v3_1.z
238
+ .array(v3_1.z.string().min(1).max(SOURCE_FINDING_MAX_LENGTH))
239
+ .min(1)
240
+ .max(SOURCE_LIST_MAX_ITEMS),
241
+ risks: v3_1.z
242
+ .array(v3_1.z.string().min(1).max(SOURCE_FINDING_MAX_LENGTH))
243
+ .max(SOURCE_LIST_MAX_ITEMS)
244
+ .optional(),
245
+ }),
246
+ }),
247
+ rivetMetadataBaseSchema.extend({
248
+ kind: v3_1.z.literal('motion_guidance'),
249
+ data: v3_1.z.object({
250
+ motionMarkdown: v3_1.z
251
+ .string()
252
+ .min(1)
253
+ .max(DESIGN_CONTEXT_MARKDOWN_MAX_LENGTH)
254
+ .optional(),
255
+ notes: v3_1.z
256
+ .array(v3_1.z.string().min(1).max(SOURCE_FINDING_MAX_LENGTH))
257
+ .min(1)
258
+ .max(SOURCE_LIST_MAX_ITEMS),
259
+ timings: v3_1.z
260
+ .array(v3_1.z.string().min(1).max(SOURCE_FINDING_MAX_LENGTH))
261
+ .max(SOURCE_LIST_MAX_ITEMS)
262
+ .optional(),
263
+ }),
264
+ }),
265
+ ]);
266
+ exports.variantContextBindingSchema = v3_1.z.discriminatedUnion('kind', [
267
+ v3_1.z.object({
268
+ kind: v3_1.z.literal('global'),
269
+ sourceIds: v3_1.z.array(v3_1.z.string().min(1)).max(SOURCE_LIST_MAX_ITEMS),
270
+ actionIds: v3_1.z.array(v3_1.z.string().min(1)).max(SOURCE_LIST_MAX_ITEMS),
271
+ metadataIds: v3_1.z
272
+ .array(v3_1.z.string().min(1))
273
+ .max(SOURCE_LIST_MAX_ITEMS)
274
+ .optional(),
275
+ }),
276
+ v3_1.z.object({
277
+ kind: v3_1.z.literal('slot'),
278
+ slotIndex: v3_1.z
279
+ .number()
280
+ .int()
281
+ .nonnegative()
282
+ .max(SOURCE_LIST_MAX_ITEMS - 1),
283
+ sourceIds: v3_1.z.array(v3_1.z.string().min(1)).max(SOURCE_LIST_MAX_ITEMS),
284
+ actionIds: v3_1.z.array(v3_1.z.string().min(1)).max(SOURCE_LIST_MAX_ITEMS),
285
+ metadataIds: v3_1.z
286
+ .array(v3_1.z.string().min(1))
287
+ .max(SOURCE_LIST_MAX_ITEMS)
288
+ .optional(),
289
+ }),
290
+ ]);
158
291
  // --- Execution capability planning ---------------------------------------
159
292
  exports.executionModeSchema = v3_1.z.enum(['static_preview', 'vite_app']);
160
293
  exports.executionConfidenceSchema = v3_1.z.enum(['low', 'medium', 'high']);
@@ -184,6 +317,19 @@ exports.executionCapabilityPlanSchema = v3_1.z.object({
184
317
  .optional(),
185
318
  userQuestion: v3_1.z.string().min(1).max(SOURCE_FINDING_MAX_LENGTH).optional(),
186
319
  });
320
+ exports.variantContextBundleSchema = v3_1.z.object({
321
+ version: v3_1.z.literal(1),
322
+ sessionId: v3_1.z.string().min(1),
323
+ contextBundlePath: v3_1.z.string().min(1).max(USER_CONTEXT_PATH_MAX_LENGTH),
324
+ userContext: v3_1.z
325
+ .array(exports.rawUserContextSourceSchema)
326
+ .min(1)
327
+ .max(SOURCE_LIST_MAX_ITEMS + 1),
328
+ rivetActions: v3_1.z.array(exports.rivetContextActionSchema).max(SOURCE_LIST_MAX_ITEMS),
329
+ rivetMetadata: v3_1.z.array(exports.rivetMetadataSchema).max(SOURCE_LIST_MAX_ITEMS),
330
+ bindings: v3_1.z.array(exports.variantContextBindingSchema).optional(),
331
+ executionPlan: exports.executionCapabilityPlanSchema.optional(),
332
+ });
187
333
  exports.projectContextExisting = v3_1.z.object({
188
334
  kind: v3_1.z.literal('existing'),
189
335
  /** Absolute project path requested for this existing-project run. Present
@@ -193,7 +339,7 @@ exports.projectContextExisting = v3_1.z.object({
193
339
  * project runs with visual references. Surfaced as DesignMD artifacts and
194
340
  * available to QA gates, but does not trigger a source-plan stage. */
195
341
  designContext: v3_1.z.array(exports.designContextEntrySchema).optional(),
196
- sourceContext: exports.sourceContextInputSchema.optional(),
342
+ variantContext: exports.variantContextBundleSchema.optional(),
197
343
  });
198
344
  exports.projectContextFresh = v3_1.z.object({
199
345
  kind: v3_1.z.literal('fresh'),
@@ -214,7 +360,7 @@ exports.projectContextFresh = v3_1.z.object({
214
360
  * markdown; markdown entries are written directly as `DESIGN.md`. The
215
361
  * order matches code-gen variant slot order. */
216
362
  designContext: v3_1.z.array(exports.designContextEntrySchema).optional(),
217
- sourceContext: exports.sourceContextInputSchema.optional(),
363
+ variantContext: exports.variantContextBundleSchema.optional(),
218
364
  /** Agent-supplied execution plan from `report_source_plan`. Drives the
219
365
  * generation routing decision at approve() time: `static_preview` keeps
220
366
  * the lightweight HTML-only path; `vite_app` provisions a real Vite
@@ -225,6 +371,16 @@ exports.projectContextSchema = v3_1.z.discriminatedUnion('kind', [
225
371
  exports.projectContextExisting,
226
372
  exports.projectContextFresh,
227
373
  ]);
374
+ const projectContextExistingInput = exports.projectContextExisting.omit({
375
+ variantContext: true,
376
+ });
377
+ const projectContextFreshInput = exports.projectContextFresh.omit({
378
+ variantContext: true,
379
+ });
380
+ exports.projectContextInputSchema = v3_1.z.discriminatedUnion('kind', [
381
+ projectContextExistingInput,
382
+ projectContextFreshInput,
383
+ ]);
228
384
  // --- Variant session artifacts -------------------------------------------
229
385
  /**
230
386
  * Kinds of supporting artifact a variants session can surface to the UI.
@@ -264,12 +420,21 @@ exports.briefSchema = v3_1.z.object({
264
420
  visualReferenceUrl: v3_1.z
265
421
  .string()
266
422
  .url()
267
- .refine((url) => (0, inspirationDesignContext_1.validateInspirationUrl)(url).ok, {
423
+ .refine((url) => (0, sourceContext_1.validateInspirationUrl)(url).ok, {
268
424
  message: 'visualReferenceUrl must be an HTTP(S) URL that does not target local or private networks',
269
425
  })
270
426
  .optional()
271
427
  .describe('Optional HTTP(S) inspiration URL. Subject to SSRF guard — must not resolve to local or private network targets.'),
272
428
  });
429
+ exports.variantWorkItemContextSchema = v3_1.z.object({
430
+ contextBundlePath: v3_1.z.string().min(1).max(USER_CONTEXT_PATH_MAX_LENGTH),
431
+ userContext: v3_1.z
432
+ .array(exports.rawUserContextSourceSchema)
433
+ .max(SOURCE_LIST_MAX_ITEMS + 1),
434
+ rivetMetadata: v3_1.z.array(exports.rivetMetadataSchema).max(SOURCE_LIST_MAX_ITEMS),
435
+ brief: exports.briefSchema,
436
+ executionMode: exports.executionModeSchema.optional(),
437
+ });
273
438
  // --- Tool I/O — propose_variants ------------------------------------------
274
439
  /**
275
440
  * Inclusive bounds for the number of variants a single propose_variants run
@@ -298,7 +463,7 @@ exports.proposeVariantsInput = {
298
463
  .max(exports.VARIANT_COUNT_MAX)
299
464
  .optional(),
300
465
  target: exports.targetSchema.optional(),
301
- projectContext: exports.projectContextSchema.optional(),
466
+ projectContext: exports.projectContextInputSchema.optional(),
302
467
  runLabel: exports.runLabelSchema,
303
468
  };
304
469
  // --- Tool I/O — report_variant_briefs -------------------------------------
@@ -308,38 +473,25 @@ exports.reportVariantBriefsInput = {
308
473
  attempt: v3_1.z.number().int().nonnegative(),
309
474
  leaseId: v3_1.z.string().optional(),
310
475
  briefs: v3_1.z.array(exports.briefSchema).min(1).max(8),
476
+ bindings: v3_1.z.array(exports.variantContextBindingSchema).max(8).optional(),
311
477
  };
312
478
  // --- Tool I/O — report_source_plan ----------------------------------------
313
479
  /**
314
- * One agent-extracted DESIGN.md, keyed by exactly one of:
315
- * - `url`: the inspiration URL the agent fetched via browser extraction
316
- * - `imageRef`: a stable `image:<index>` reference matching an image-kind
317
- * entry in the session's `sourceArtifacts` (see `buildImageRefs` in
318
- * SessionStore for index semantics)
319
- */
320
- const browserDesignContextSchema = v3_1.z
321
- .object({
322
- url: v3_1.z.string().min(1).max(SOURCE_URL_MAX_LENGTH).optional(),
323
- imageRef: v3_1.z.string().min(1).max(64).optional(),
324
- label: v3_1.z.string().min(1).max(60),
325
- markdown: v3_1.z.string().min(1).max(DESIGN_CONTEXT_MARKDOWN_MAX_LENGTH),
326
- })
327
- .refine((entry) => Boolean(entry.url) !== Boolean(entry.imageRef), {
328
- message: 'designContexts entry must specify exactly one of `url` or `imageRef`.',
329
- });
330
- /**
331
- * Consolidated planning artifact reported by the agent in a single tool call.
332
- * Combines URL/role classification, research findings, browser-extracted
333
- * DESIGN.md per design_source URL, and the static_preview vs vite_app
334
- * execution decision. Replaces the prior `report_source_intent` +
335
- * `report_source_context` round-trips so source-grounded sessions only need
336
- * one planning hop before briefs.
480
+ * Canonical planning artifact reported by the agent in a single tool call.
481
+ * The agent inspects raw `userContext` natively, selects Rivet actions from
482
+ * `input.availableActions`, and reports the additive metadata those actions
483
+ * produce plus the static_preview vs vite_app execution decision. `actions`
484
+ * and `metadata` are required (each reported action must produce its matching
485
+ * metadata kind); `bindings` is optional and scopes context per variant slot.
486
+ * The legacy summary-first fields (`sourceIntent`, `sourceContext`,
487
+ * `designContexts`) are intentionally absent — derived guidance now comes
488
+ * from action metadata.
337
489
  */
338
490
  exports.sourcePlanArtifactSchema = v3_1.z.object({
339
- sourceIntent: exports.sourceIntentArtifactSchema,
340
- sourceContext: exports.sourceContextArtifactSchema,
341
- designContexts: v3_1.z
342
- .array(browserDesignContextSchema)
491
+ actions: v3_1.z.array(exports.rivetContextActionSchema).max(SOURCE_LIST_MAX_ITEMS),
492
+ metadata: v3_1.z.array(exports.rivetMetadataSchema).max(SOURCE_LIST_MAX_ITEMS),
493
+ bindings: v3_1.z
494
+ .array(exports.variantContextBindingSchema)
343
495
  .max(SOURCE_LIST_MAX_ITEMS)
344
496
  .optional(),
345
497
  executionPlan: exports.executionCapabilityPlanSchema,
@@ -415,32 +567,6 @@ exports.reportVariantCompleteInput = {
415
567
  tokensOut: v3_1.z.number().int().nonnegative().optional(),
416
568
  model: v3_1.z.string().optional(),
417
569
  };
418
- // --- Tool I/O — extract_inspiration_context ------------------------------
419
- /**
420
- * Stateless inspiration-extraction kickoff. Agents call this before
421
- * `start_variants(mode='zero_to_one')` when the user provides inspiration
422
- * URLs or other source artifacts, then pass the returned `designContext`
423
- * (and optional `sourceContext` echo) into `start_variants`.
424
- */
425
- exports.extractInspirationContextInput = {
426
- prompt: v3_1.z.string().min(1),
427
- count: v3_1.z.number().int().min(exports.VARIANT_COUNT_MIN).max(exports.VARIANT_COUNT_MAX),
428
- urls: v3_1.z
429
- .array(v3_1.z.string().min(1).max(SOURCE_URL_MAX_LENGTH))
430
- .max(SOURCE_LIST_MAX_ITEMS)
431
- .optional(),
432
- preserveBrand: v3_1.z.boolean().optional(),
433
- sourceArtifacts: v3_1.z
434
- .array(exports.sourceArtifactInputSchema)
435
- .max(SOURCE_LIST_MAX_ITEMS)
436
- .optional(),
437
- /** When true, bypass any cache entry and force a fresh fetch + extract. */
438
- forceRefresh: v3_1.z.boolean().optional(),
439
- /** Caller-supplied correlation id, echoed into telemetry so this stateless
440
- * extraction can be tied to the subsequent `start_variants` call (which
441
- * accepts the same field) even though no session exists yet. */
442
- clientRequestId: v3_1.z.string().optional(),
443
- };
444
570
  // --- Tool I/O — cancel_variants -------------------------------------------
445
571
  exports.cancelVariantsInput = {
446
572
  sessionId: v3_1.z.string().min(1),
@@ -496,14 +622,20 @@ exports.startVariantsInput = {
496
622
  * server's current working directory. Used to detect framework and
497
623
  * auto-open the visual editor without a separate detect_project call. */
498
624
  projectPath: v3_1.z.string().optional(),
499
- /** Zero-to-one only: per-variant-slot design context produced upstream by
500
- * `extract_inspiration_context`. Threaded into the fresh worktree as
501
- * DESIGN.md per slot. Slot order matches variant order. */
625
+ /** Per-variant-slot design context (slug entries resolve bundled catalog
626
+ * markdown; markdown entries are written directly as DESIGN.md). Slot order
627
+ * matches variant order. */
502
628
  designContext: v3_1.z.array(exports.designContextEntrySchema).optional(),
503
- /** Zero-to-one only: optional source-context metadata (inspiration URLs,
504
- * preserveBrand flag, sourceArtifacts). Forwarded to the worktree
505
- * scaffold so SOURCE_CONTEXT.md is written. */
506
- sourceContext: exports.sourceContextInputSchema.optional(),
629
+ /** Optional raw sources attached by the caller — inspiration URLs, local
630
+ * images/videos, uploaded image data URLs, directories, or pasted text.
631
+ * Rivet stores these as
632
+ * read-only user context (the variant context bundle) and, for fresh
633
+ * source-grounded runs, lets source planning decide what metadata actions
634
+ * to derive. The sole source-intake field. */
635
+ userContext: v3_1.z
636
+ .array(exports.rawUserContextInputSchema)
637
+ .max(SOURCE_LIST_MAX_ITEMS)
638
+ .optional(),
507
639
  clientRequestId: v3_1.z.string().optional(),
508
640
  };
509
641
  // --- Tool I/O — list_past_variants / get_variant ------------------------
@@ -520,6 +652,24 @@ exports.listPastVariantsInput = {
520
652
  limit: v3_1.z.number().int().min(1).max(500).optional(),
521
653
  status: exports.variantHistoryStatusSchema.optional(),
522
654
  };
655
+ // --- Tool I/O — capture_design_evidence ----------------------------------
656
+ // Renders a reference URL on a remote browser (via the proxy / browser agent)
657
+ // and returns DESIGN.md-shaped markdown derived from rendered DOM + resolved
658
+ // computed styles. The source-plan agent calls this for URL sources before
659
+ // reporting design_system, so the system is extracted rather than inferred.
660
+ exports.captureDesignEvidenceInput = {
661
+ /** Correlation only; safe to omit. */
662
+ sessionId: v3_1.z.string().min(1).optional(),
663
+ /** The reference URL to render. */
664
+ url: v3_1.z.string().url(),
665
+ /** Optional viewport override; defaults to desktop 1440x1000. */
666
+ viewport: v3_1.z
667
+ .object({
668
+ width: v3_1.z.number().int().min(320).max(3840),
669
+ height: v3_1.z.number().int().min(320).max(2160),
670
+ })
671
+ .optional(),
672
+ };
523
673
  exports.getVariantInput = {
524
674
  projectPath: v3_1.z.string().optional(),
525
675
  sessionId: v3_1.z.string().min(1),