rivet-design 0.12.3 → 0.13.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 (535) hide show
  1. package/README.md +50 -26
  2. package/README.npm.md +50 -26
  3. package/bin/rivet.js +39 -24
  4. package/dist/{mcp/agent-variants → agent-variants}/SessionStore.d.ts +11 -19
  5. package/dist/agent-variants/SessionStore.d.ts.map +1 -0
  6. package/dist/{mcp/agent-variants → agent-variants}/SessionStore.js +77 -80
  7. package/dist/agent-variants/SessionStore.js.map +1 -0
  8. package/dist/{mcp/agent-variants → agent-variants}/WorktreeOrchestrator.d.ts +53 -21
  9. package/dist/agent-variants/WorktreeOrchestrator.d.ts.map +1 -0
  10. package/dist/{mcp/agent-variants → agent-variants}/WorktreeOrchestrator.js +291 -49
  11. package/dist/agent-variants/WorktreeOrchestrator.js.map +1 -0
  12. package/dist/{mcp/agent-variants → agent-variants}/WorktreeOrchestrator.testHelpers.d.ts +1 -9
  13. package/dist/agent-variants/WorktreeOrchestrator.testHelpers.d.ts.map +1 -0
  14. package/dist/{mcp/agent-variants → agent-variants}/WorktreeOrchestrator.testHelpers.js +3 -18
  15. package/dist/agent-variants/WorktreeOrchestrator.testHelpers.js.map +1 -0
  16. package/dist/agent-variants/briefContent.d.ts.map +1 -0
  17. package/dist/agent-variants/briefContent.js.map +1 -0
  18. package/dist/{mcp/agent-variants → agent-variants}/contracts.d.ts +715 -721
  19. package/dist/agent-variants/contracts.d.ts.map +1 -0
  20. package/dist/{mcp/agent-variants → agent-variants}/contracts.js +2 -3
  21. package/dist/agent-variants/contracts.js.map +1 -0
  22. package/dist/agent-variants/createProjectArtifacts.d.ts.map +1 -0
  23. package/dist/agent-variants/createProjectArtifacts.js.map +1 -0
  24. package/dist/agent-variants/diffQa.d.ts.map +1 -0
  25. package/dist/agent-variants/diffQa.js.map +1 -0
  26. package/dist/{mcp/agent-variants → agent-variants}/elementRefToTarget.d.ts +1 -1
  27. package/dist/agent-variants/elementRefToTarget.d.ts.map +1 -0
  28. package/dist/agent-variants/elementRefToTarget.js.map +1 -0
  29. package/dist/agent-variants/errors.d.ts.map +1 -0
  30. package/dist/agent-variants/errors.js.map +1 -0
  31. package/dist/agent-variants/generatedDestination.d.ts +29 -0
  32. package/dist/agent-variants/generatedDestination.d.ts.map +1 -0
  33. package/dist/agent-variants/generatedDestination.js +59 -0
  34. package/dist/agent-variants/generatedDestination.js.map +1 -0
  35. package/dist/{mcp/agent-variants → agent-variants}/index.d.ts +3 -6
  36. package/dist/agent-variants/index.d.ts.map +1 -0
  37. package/dist/{mcp/agent-variants → agent-variants}/index.js +3 -6
  38. package/dist/agent-variants/index.js.map +1 -0
  39. package/dist/agent-variants/previewQa.d.ts.map +1 -0
  40. package/dist/agent-variants/previewQa.js.map +1 -0
  41. package/dist/agent-variants/runLabel.d.ts.map +1 -0
  42. package/dist/agent-variants/runLabel.js.map +1 -0
  43. package/dist/agent-variants/runPlan.d.ts.map +1 -0
  44. package/dist/agent-variants/runPlan.js.map +1 -0
  45. package/dist/agent-variants/sourceContext.d.ts.map +1 -0
  46. package/dist/agent-variants/sourceContext.js.map +1 -0
  47. package/dist/agent-variants/variantContext.d.ts.map +1 -0
  48. package/dist/agent-variants/variantContext.js.map +1 -0
  49. package/dist/cli/client.d.ts +43 -0
  50. package/dist/cli/client.d.ts.map +1 -0
  51. package/dist/cli/client.js +109 -0
  52. package/dist/cli/client.js.map +1 -0
  53. package/dist/cli/commandNames.d.ts +9 -0
  54. package/dist/cli/commandNames.d.ts.map +1 -0
  55. package/dist/cli/commandNames.js +24 -0
  56. package/dist/cli/commandNames.js.map +1 -0
  57. package/dist/cli/commands/auth.d.ts +10 -0
  58. package/dist/cli/commands/auth.d.ts.map +1 -0
  59. package/dist/cli/commands/auth.js +81 -0
  60. package/dist/cli/commands/auth.js.map +1 -0
  61. package/dist/cli/commands/elementSelector.d.ts +10 -0
  62. package/dist/cli/commands/elementSelector.d.ts.map +1 -0
  63. package/dist/cli/commands/elementSelector.js +41 -0
  64. package/dist/cli/commands/elementSelector.js.map +1 -0
  65. package/dist/cli/commands/evidence.d.ts +9 -0
  66. package/dist/cli/commands/evidence.d.ts.map +1 -0
  67. package/dist/cli/commands/evidence.js +85 -0
  68. package/dist/cli/commands/evidence.js.map +1 -0
  69. package/dist/cli/commands/mcpServe.d.ts +40 -0
  70. package/dist/cli/commands/mcpServe.d.ts.map +1 -0
  71. package/dist/cli/commands/mcpServe.js +440 -0
  72. package/dist/cli/commands/mcpServe.js.map +1 -0
  73. package/dist/cli/commands/open.d.ts +28 -0
  74. package/dist/cli/commands/open.d.ts.map +1 -0
  75. package/dist/cli/commands/open.js +280 -0
  76. package/dist/cli/commands/open.js.map +1 -0
  77. package/dist/cli/commands/reference.d.ts +8 -0
  78. package/dist/cli/commands/reference.d.ts.map +1 -0
  79. package/dist/cli/commands/reference.js +101 -0
  80. package/dist/cli/commands/reference.js.map +1 -0
  81. package/dist/cli/commands/serve.d.ts +9 -0
  82. package/dist/cli/commands/serve.d.ts.map +1 -0
  83. package/dist/cli/commands/serve.js +182 -0
  84. package/dist/cli/commands/serve.js.map +1 -0
  85. package/dist/cli/commands/shared.d.ts +31 -0
  86. package/dist/cli/commands/shared.d.ts.map +1 -0
  87. package/dist/cli/commands/shared.js +82 -0
  88. package/dist/cli/commands/shared.js.map +1 -0
  89. package/dist/cli/commands/status.d.ts +10 -0
  90. package/dist/cli/commands/status.d.ts.map +1 -0
  91. package/dist/cli/commands/status.js +61 -0
  92. package/dist/cli/commands/status.js.map +1 -0
  93. package/dist/cli/commands/stop.d.ts +8 -0
  94. package/dist/cli/commands/stop.d.ts.map +1 -0
  95. package/dist/cli/commands/stop.js +41 -0
  96. package/dist/cli/commands/stop.js.map +1 -0
  97. package/dist/cli/commands/variants.d.ts +4 -0
  98. package/dist/cli/commands/variants.d.ts.map +1 -0
  99. package/dist/cli/commands/variants.js +374 -0
  100. package/dist/cli/commands/variants.js.map +1 -0
  101. package/dist/cli/commands/wait.d.ts +10 -0
  102. package/dist/cli/commands/wait.d.ts.map +1 -0
  103. package/dist/cli/commands/wait.js +101 -0
  104. package/dist/cli/commands/wait.js.map +1 -0
  105. package/dist/cli/entry.d.ts +12 -0
  106. package/dist/cli/entry.d.ts.map +1 -0
  107. package/dist/cli/entry.js +61 -0
  108. package/dist/cli/entry.js.map +1 -0
  109. package/dist/cli/envelope.d.ts +60 -0
  110. package/dist/cli/envelope.d.ts.map +1 -0
  111. package/dist/cli/envelope.js +57 -0
  112. package/dist/cli/envelope.js.map +1 -0
  113. package/dist/cli/flags.d.ts +20 -0
  114. package/dist/cli/flags.d.ts.map +1 -0
  115. package/dist/cli/flags.js +72 -0
  116. package/dist/cli/flags.js.map +1 -0
  117. package/dist/cli/handoff.d.ts +54 -0
  118. package/dist/cli/handoff.d.ts.map +1 -0
  119. package/dist/cli/handoff.js +106 -0
  120. package/dist/cli/handoff.js.map +1 -0
  121. package/dist/cli/handoffStore.d.ts +24 -0
  122. package/dist/cli/handoffStore.d.ts.map +1 -0
  123. package/dist/cli/handoffStore.js +49 -0
  124. package/dist/cli/handoffStore.js.map +1 -0
  125. package/dist/cli/hostWorkNextAction.d.ts +45 -0
  126. package/dist/cli/hostWorkNextAction.d.ts.map +1 -0
  127. package/dist/cli/hostWorkNextAction.js +43 -0
  128. package/dist/cli/hostWorkNextAction.js.map +1 -0
  129. package/dist/cli/io.d.ts +17 -0
  130. package/dist/cli/io.d.ts.map +1 -0
  131. package/dist/cli/io.js +19 -0
  132. package/dist/cli/io.js.map +1 -0
  133. package/dist/cli/router.d.ts +23 -0
  134. package/dist/cli/router.d.ts.map +1 -0
  135. package/dist/cli/router.js +236 -0
  136. package/dist/cli/router.js.map +1 -0
  137. package/dist/cli/runnerSelection.d.ts +60 -0
  138. package/dist/cli/runnerSelection.d.ts.map +1 -0
  139. package/dist/cli/runnerSelection.js +93 -0
  140. package/dist/cli/runnerSelection.js.map +1 -0
  141. package/dist/cli/serverHandshake.d.ts +51 -0
  142. package/dist/cli/serverHandshake.d.ts.map +1 -0
  143. package/dist/cli/serverHandshake.js +144 -0
  144. package/dist/cli/serverHandshake.js.map +1 -0
  145. package/dist/index.d.ts +2 -14
  146. package/dist/index.d.ts.map +1 -1
  147. package/dist/index.js +84 -138
  148. package/dist/index.js.map +1 -1
  149. package/dist/install/allowlists.d.ts +65 -0
  150. package/dist/install/allowlists.d.ts.map +1 -0
  151. package/dist/install/allowlists.js +333 -0
  152. package/dist/install/allowlists.js.map +1 -0
  153. package/dist/install/codexGuidance.d.ts +11 -0
  154. package/dist/install/codexGuidance.d.ts.map +1 -0
  155. package/dist/install/codexGuidance.js +90 -0
  156. package/dist/install/codexGuidance.js.map +1 -0
  157. package/dist/install/harnesses.d.ts +37 -26
  158. package/dist/install/harnesses.d.ts.map +1 -1
  159. package/dist/install/harnesses.js +312 -502
  160. package/dist/install/harnesses.js.map +1 -1
  161. package/dist/install/legacyMcp.d.ts +26 -0
  162. package/dist/install/legacyMcp.d.ts.map +1 -0
  163. package/dist/install/legacyMcp.js +160 -0
  164. package/dist/install/legacyMcp.js.map +1 -0
  165. package/dist/install/mcpRegistration.d.ts +45 -0
  166. package/dist/install/mcpRegistration.d.ts.map +1 -0
  167. package/dist/install/mcpRegistration.js +215 -0
  168. package/dist/install/mcpRegistration.js.map +1 -0
  169. package/dist/mcp/changeBatchClassification.d.ts +18 -20
  170. package/dist/mcp/changeBatchClassification.d.ts.map +1 -1
  171. package/dist/mcp/changeBatchClassification.js +41 -46
  172. package/dist/mcp/changeBatchClassification.js.map +1 -1
  173. package/dist/proxy-middleware/proxy-config.d.ts +6 -0
  174. package/dist/proxy-middleware/proxy-config.d.ts.map +1 -1
  175. package/dist/proxy-middleware/proxy-config.js +162 -5
  176. package/dist/proxy-middleware/proxy-config.js.map +1 -1
  177. package/dist/routes/agentVariants.d.ts +14 -2
  178. package/dist/routes/agentVariants.d.ts.map +1 -1
  179. package/dist/routes/agentVariants.js +321 -65
  180. package/dist/routes/agentVariants.js.map +1 -1
  181. package/dist/routes/cli.d.ts +31 -0
  182. package/dist/routes/cli.d.ts.map +1 -0
  183. package/dist/routes/cli.js +95 -0
  184. package/dist/routes/cli.js.map +1 -0
  185. package/dist/routes/git.d.ts +1 -0
  186. package/dist/routes/git.d.ts.map +1 -1
  187. package/dist/routes/git.js +2 -1
  188. package/dist/routes/git.js.map +1 -1
  189. package/dist/routes/inlineStartTracker.d.ts +23 -0
  190. package/dist/routes/inlineStartTracker.d.ts.map +1 -0
  191. package/dist/routes/inlineStartTracker.js +17 -0
  192. package/dist/routes/inlineStartTracker.js.map +1 -0
  193. package/dist/routes/mcp.d.ts +2 -12
  194. package/dist/routes/mcp.d.ts.map +1 -1
  195. package/dist/routes/mcp.js +4 -785
  196. package/dist/routes/mcp.js.map +1 -1
  197. package/dist/server.d.ts +24 -9
  198. package/dist/server.d.ts.map +1 -1
  199. package/dist/server.js +169 -33
  200. package/dist/server.js.map +1 -1
  201. package/dist/services/CommitMessageGenerator.d.ts +9 -1
  202. package/dist/services/CommitMessageGenerator.d.ts.map +1 -1
  203. package/dist/services/CommitMessageGenerator.js +4 -1
  204. package/dist/services/CommitMessageGenerator.js.map +1 -1
  205. package/dist/services/ComponentSearchService.d.ts +4 -1
  206. package/dist/services/ComponentSearchService.d.ts.map +1 -1
  207. package/dist/services/ComponentSearchService.js.map +1 -1
  208. package/dist/services/ConfigManager.d.ts +8 -0
  209. package/dist/services/ConfigManager.d.ts.map +1 -1
  210. package/dist/services/ConfigManager.js +9 -0
  211. package/dist/services/ConfigManager.js.map +1 -1
  212. package/dist/services/HistoryReplayService.d.ts +20 -9
  213. package/dist/services/HistoryReplayService.d.ts.map +1 -1
  214. package/dist/services/HistoryReplayService.js +99 -43
  215. package/dist/services/HistoryReplayService.js.map +1 -1
  216. package/dist/services/MCPVariantsTelemetry.d.ts +1 -1
  217. package/dist/services/MCPVariantsTelemetry.d.ts.map +1 -1
  218. package/dist/services/MCPVariantsTelemetry.js +1 -0
  219. package/dist/services/MCPVariantsTelemetry.js.map +1 -1
  220. package/dist/services/PRTitleGenerator.d.ts +10 -2
  221. package/dist/services/PRTitleGenerator.d.ts.map +1 -1
  222. package/dist/services/PRTitleGenerator.js +8 -2
  223. package/dist/services/PRTitleGenerator.js.map +1 -1
  224. package/dist/services/ProjectDetectionService.d.ts.map +1 -1
  225. package/dist/services/ProjectDetectionService.js +14 -4
  226. package/dist/services/ProjectDetectionService.js.map +1 -1
  227. package/dist/services/ProjectMetadataStore.d.ts +115 -0
  228. package/dist/services/ProjectMetadataStore.d.ts.map +1 -0
  229. package/dist/services/ProjectMetadataStore.js +336 -0
  230. package/dist/services/ProjectMetadataStore.js.map +1 -0
  231. package/dist/services/SessionBridgeService.d.ts +52 -224
  232. package/dist/services/SessionBridgeService.d.ts.map +1 -1
  233. package/dist/services/SessionBridgeService.js +97 -649
  234. package/dist/services/SessionBridgeService.js.map +1 -1
  235. package/dist/services/SessionService.d.ts +4 -1
  236. package/dist/services/SessionService.d.ts.map +1 -1
  237. package/dist/services/SessionService.js +7 -4
  238. package/dist/services/SessionService.js.map +1 -1
  239. package/dist/services/StaticFileService.d.ts.map +1 -1
  240. package/dist/services/StaticFileService.js +6 -0
  241. package/dist/services/StaticFileService.js.map +1 -1
  242. package/dist/services/TelemetryService.d.ts +16 -80
  243. package/dist/services/TelemetryService.d.ts.map +1 -1
  244. package/dist/services/TelemetryService.js +18 -94
  245. package/dist/services/TelemetryService.js.map +1 -1
  246. package/dist/services/VariantGenerationService.d.ts +52 -0
  247. package/dist/services/VariantGenerationService.d.ts.map +1 -0
  248. package/dist/services/VariantGenerationService.js +272 -0
  249. package/dist/services/VariantGenerationService.js.map +1 -0
  250. package/dist/services/VariantHistoryService.d.ts +37 -1
  251. package/dist/services/VariantHistoryService.d.ts.map +1 -1
  252. package/dist/services/VariantHistoryService.js +122 -1
  253. package/dist/services/VariantHistoryService.js.map +1 -1
  254. package/dist/services/VariantRunService.d.ts +25 -6
  255. package/dist/services/VariantRunService.d.ts.map +1 -1
  256. package/dist/services/VariantRunService.js +98 -4
  257. package/dist/services/VariantRunService.js.map +1 -1
  258. package/dist/services/VariantsRuntime.d.ts +1 -3
  259. package/dist/services/VariantsRuntime.d.ts.map +1 -1
  260. package/dist/services/VariantsRuntime.js +0 -1
  261. package/dist/services/VariantsRuntime.js.map +1 -1
  262. package/dist/services/WorktreeManager.d.ts +1 -1
  263. package/dist/services/WorktreeManager.d.ts.map +1 -1
  264. package/dist/services/createAgentVariantsOrchestrator.d.ts +2 -2
  265. package/dist/services/createAgentVariantsOrchestrator.d.ts.map +1 -1
  266. package/dist/services/createAgentVariantsOrchestrator.js +2 -3
  267. package/dist/services/createAgentVariantsOrchestrator.js.map +1 -1
  268. package/dist/services/projectMetadataMigrations.d.ts +59 -0
  269. package/dist/services/projectMetadataMigrations.d.ts.map +1 -0
  270. package/dist/services/projectMetadataMigrations.js +109 -0
  271. package/dist/services/projectMetadataMigrations.js.map +1 -0
  272. package/dist/types/change-request-types.d.ts +22 -0
  273. package/dist/types/change-request-types.d.ts.map +1 -1
  274. package/dist/utils/logger.d.ts +2 -1
  275. package/dist/utils/logger.d.ts.map +1 -1
  276. package/dist/utils/logger.js +3 -7
  277. package/dist/utils/logger.js.map +1 -1
  278. package/dist/utils/loopback.d.ts +3 -0
  279. package/dist/utils/loopback.d.ts.map +1 -0
  280. package/dist/utils/loopback.js +13 -0
  281. package/dist/utils/loopback.js.map +1 -0
  282. package/dist/utils/pid.d.ts +3 -0
  283. package/dist/utils/pid.d.ts.map +1 -0
  284. package/dist/utils/pid.js +15 -0
  285. package/dist/utils/pid.js.map +1 -0
  286. package/dist/utils/queueAccess.d.ts +7 -0
  287. package/dist/utils/queueAccess.d.ts.map +1 -1
  288. package/dist/utils/queueAccess.js +8 -1
  289. package/dist/utils/queueAccess.js.map +1 -1
  290. package/dist/utils/shouldRecordHostedDemoSessionAction.d.ts +3 -3
  291. package/dist/utils/shouldRecordHostedDemoSessionAction.d.ts.map +1 -1
  292. package/dist/utils/shouldRecordHostedDemoSessionAction.js +3 -19
  293. package/dist/utils/shouldRecordHostedDemoSessionAction.js.map +1 -1
  294. package/dist/utils/skillWriter.d.ts.map +1 -1
  295. package/dist/utils/skillWriter.js +12 -11
  296. package/dist/utils/skillWriter.js.map +1 -1
  297. package/dist/utils/skills/claude-skill.d.ts +7 -2
  298. package/dist/utils/skills/claude-skill.d.ts.map +1 -1
  299. package/dist/utils/skills/claude-skill.js +10 -83
  300. package/dist/utils/skills/claude-skill.js.map +1 -1
  301. package/dist/utils/skills/cli-guidance.d.ts +12 -0
  302. package/dist/utils/skills/cli-guidance.d.ts.map +1 -0
  303. package/dist/utils/skills/cli-guidance.js +57 -0
  304. package/dist/utils/skills/cli-guidance.js.map +1 -0
  305. package/dist/utils/skills/cursor-rules.d.ts +8 -2
  306. package/dist/utils/skills/cursor-rules.d.ts.map +1 -1
  307. package/dist/utils/skills/cursor-rules.js +11 -80
  308. package/dist/utils/skills/cursor-rules.js.map +1 -1
  309. package/dist/utils/variantSessionStart.d.ts +1 -1
  310. package/dist/utils/variantSessionStart.d.ts.map +1 -1
  311. package/dist/utils/variantSessionStart.js +1 -1
  312. package/dist/utils/variantSessionStart.js.map +1 -1
  313. package/package.json +4 -4
  314. package/src/ui/dist/assets/main-BWOvFoal.js +419 -0
  315. package/src/ui/dist/assets/main-Dyos9I29.css +1 -0
  316. package/src/ui/dist/index.html +2 -2
  317. package/dist/mcp/agent-variants/SessionStore.d.ts.map +0 -1
  318. package/dist/mcp/agent-variants/SessionStore.js.map +0 -1
  319. package/dist/mcp/agent-variants/WorktreeOrchestrator.d.ts.map +0 -1
  320. package/dist/mcp/agent-variants/WorktreeOrchestrator.js.map +0 -1
  321. package/dist/mcp/agent-variants/WorktreeOrchestrator.testHelpers.d.ts.map +0 -1
  322. package/dist/mcp/agent-variants/WorktreeOrchestrator.testHelpers.js.map +0 -1
  323. package/dist/mcp/agent-variants/areNaSourceContext.d.ts +0 -20
  324. package/dist/mcp/agent-variants/areNaSourceContext.d.ts.map +0 -1
  325. package/dist/mcp/agent-variants/areNaSourceContext.js +0 -118
  326. package/dist/mcp/agent-variants/areNaSourceContext.js.map +0 -1
  327. package/dist/mcp/agent-variants/briefContent.d.ts.map +0 -1
  328. package/dist/mcp/agent-variants/briefContent.js.map +0 -1
  329. package/dist/mcp/agent-variants/contracts.d.ts.map +0 -1
  330. package/dist/mcp/agent-variants/contracts.js.map +0 -1
  331. package/dist/mcp/agent-variants/createProjectArtifacts.d.ts.map +0 -1
  332. package/dist/mcp/agent-variants/createProjectArtifacts.js.map +0 -1
  333. package/dist/mcp/agent-variants/createZeroToOneTool.d.ts +0 -63
  334. package/dist/mcp/agent-variants/createZeroToOneTool.d.ts.map +0 -1
  335. package/dist/mcp/agent-variants/createZeroToOneTool.js +0 -265
  336. package/dist/mcp/agent-variants/createZeroToOneTool.js.map +0 -1
  337. package/dist/mcp/agent-variants/diffQa.d.ts.map +0 -1
  338. package/dist/mcp/agent-variants/diffQa.js.map +0 -1
  339. package/dist/mcp/agent-variants/elementRefToTarget.d.ts.map +0 -1
  340. package/dist/mcp/agent-variants/elementRefToTarget.js.map +0 -1
  341. package/dist/mcp/agent-variants/errors.d.ts.map +0 -1
  342. package/dist/mcp/agent-variants/errors.js.map +0 -1
  343. package/dist/mcp/agent-variants/generatedDestination.d.ts +0 -75
  344. package/dist/mcp/agent-variants/generatedDestination.d.ts.map +0 -1
  345. package/dist/mcp/agent-variants/generatedDestination.js +0 -103
  346. package/dist/mcp/agent-variants/generatedDestination.js.map +0 -1
  347. package/dist/mcp/agent-variants/index.d.ts.map +0 -1
  348. package/dist/mcp/agent-variants/index.js.map +0 -1
  349. package/dist/mcp/agent-variants/pendingChangesAdapter.d.ts +0 -38
  350. package/dist/mcp/agent-variants/pendingChangesAdapter.d.ts.map +0 -1
  351. package/dist/mcp/agent-variants/pendingChangesAdapter.js +0 -93
  352. package/dist/mcp/agent-variants/pendingChangesAdapter.js.map +0 -1
  353. package/dist/mcp/agent-variants/pinterestSourceContext.d.ts +0 -23
  354. package/dist/mcp/agent-variants/pinterestSourceContext.d.ts.map +0 -1
  355. package/dist/mcp/agent-variants/pinterestSourceContext.js +0 -137
  356. package/dist/mcp/agent-variants/pinterestSourceContext.js.map +0 -1
  357. package/dist/mcp/agent-variants/previewQa.d.ts.map +0 -1
  358. package/dist/mcp/agent-variants/previewQa.js.map +0 -1
  359. package/dist/mcp/agent-variants/runLabel.d.ts.map +0 -1
  360. package/dist/mcp/agent-variants/runLabel.js.map +0 -1
  361. package/dist/mcp/agent-variants/runPlan.d.ts.map +0 -1
  362. package/dist/mcp/agent-variants/runPlan.js.map +0 -1
  363. package/dist/mcp/agent-variants/sourceContext.d.ts.map +0 -1
  364. package/dist/mcp/agent-variants/sourceContext.js.map +0 -1
  365. package/dist/mcp/agent-variants/tools.d.ts +0 -187
  366. package/dist/mcp/agent-variants/tools.d.ts.map +0 -1
  367. package/dist/mcp/agent-variants/tools.js +0 -1165
  368. package/dist/mcp/agent-variants/tools.js.map +0 -1
  369. package/dist/mcp/agent-variants/variantContext.d.ts.map +0 -1
  370. package/dist/mcp/agent-variants/variantContext.js.map +0 -1
  371. package/dist/mcp/auth/httpOAuthProvider.d.ts +0 -103
  372. package/dist/mcp/auth/httpOAuthProvider.d.ts.map +0 -1
  373. package/dist/mcp/auth/httpOAuthProvider.js +0 -735
  374. package/dist/mcp/auth/httpOAuthProvider.js.map +0 -1
  375. package/dist/mcp/auth/tools.d.ts +0 -39
  376. package/dist/mcp/auth/tools.d.ts.map +0 -1
  377. package/dist/mcp/auth/tools.js +0 -304
  378. package/dist/mcp/auth/tools.js.map +0 -1
  379. package/dist/mcp/branding.d.ts +0 -4
  380. package/dist/mcp/branding.d.ts.map +0 -1
  381. package/dist/mcp/branding.js +0 -8
  382. package/dist/mcp/branding.js.map +0 -1
  383. package/dist/mcp/hostedServer.d.ts +0 -27
  384. package/dist/mcp/hostedServer.d.ts.map +0 -1
  385. package/dist/mcp/hostedServer.js +0 -71
  386. package/dist/mcp/hostedServer.js.map +0 -1
  387. package/dist/mcp/httpServer.d.ts +0 -63
  388. package/dist/mcp/httpServer.d.ts.map +0 -1
  389. package/dist/mcp/httpServer.js +0 -602
  390. package/dist/mcp/httpServer.js.map +0 -1
  391. package/dist/mcp/instructions.d.ts +0 -25
  392. package/dist/mcp/instructions.d.ts.map +0 -1
  393. package/dist/mcp/instructions.js +0 -39
  394. package/dist/mcp/instructions.js.map +0 -1
  395. package/dist/mcp/integrations/tools.d.ts +0 -19
  396. package/dist/mcp/integrations/tools.d.ts.map +0 -1
  397. package/dist/mcp/integrations/tools.js +0 -101
  398. package/dist/mcp/integrations/tools.js.map +0 -1
  399. package/dist/mcp/server.d.ts +0 -214
  400. package/dist/mcp/server.d.ts.map +0 -1
  401. package/dist/mcp/server.js +0 -2536
  402. package/dist/mcp/server.js.map +0 -1
  403. package/dist/mcp/toolAnalytics.d.ts +0 -26
  404. package/dist/mcp/toolAnalytics.d.ts.map +0 -1
  405. package/dist/mcp/toolAnalytics.js +0 -95
  406. package/dist/mcp/toolAnalytics.js.map +0 -1
  407. package/dist/mcp/types.d.ts +0 -7
  408. package/dist/mcp/types.d.ts.map +0 -1
  409. package/dist/mcp/types.js +0 -3
  410. package/dist/mcp/types.js.map +0 -1
  411. package/dist/mcp/watchLoopResumePrompt.d.ts +0 -16
  412. package/dist/mcp/watchLoopResumePrompt.d.ts.map +0 -1
  413. package/dist/mcp/watchLoopResumePrompt.js +0 -21
  414. package/dist/mcp/watchLoopResumePrompt.js.map +0 -1
  415. package/dist/prompts/agentModPrompts.d.ts +0 -4
  416. package/dist/prompts/agentModPrompts.d.ts.map +0 -1
  417. package/dist/prompts/agentModPrompts.js +0 -34
  418. package/dist/prompts/agentModPrompts.js.map +0 -1
  419. package/dist/prompts/tokenWriterPrompts.d.ts +0 -4
  420. package/dist/prompts/tokenWriterPrompts.d.ts.map +0 -1
  421. package/dist/prompts/tokenWriterPrompts.js +0 -59
  422. package/dist/prompts/tokenWriterPrompts.js.map +0 -1
  423. package/dist/routes/comments.d.ts +0 -3
  424. package/dist/routes/comments.d.ts.map +0 -1
  425. package/dist/routes/comments.js +0 -113
  426. package/dist/routes/comments.js.map +0 -1
  427. package/dist/routes/components.d.ts +0 -7
  428. package/dist/routes/components.d.ts.map +0 -1
  429. package/dist/routes/components.js +0 -88
  430. package/dist/routes/components.js.map +0 -1
  431. package/dist/routes/controls.d.ts +0 -7
  432. package/dist/routes/controls.d.ts.map +0 -1
  433. package/dist/routes/controls.js +0 -50
  434. package/dist/routes/controls.js.map +0 -1
  435. package/dist/routes/design.d.ts +0 -2
  436. package/dist/routes/design.d.ts.map +0 -1
  437. package/dist/routes/design.js +0 -29
  438. package/dist/routes/design.js.map +0 -1
  439. package/dist/routes/modifications.d.ts +0 -10
  440. package/dist/routes/modifications.d.ts.map +0 -1
  441. package/dist/routes/modifications.js +0 -394
  442. package/dist/routes/modifications.js.map +0 -1
  443. package/dist/routes/tokens.d.ts +0 -2
  444. package/dist/routes/tokens.d.ts.map +0 -1
  445. package/dist/routes/tokens.js +0 -115
  446. package/dist/routes/tokens.js.map +0 -1
  447. package/dist/services/AgentSessionService.d.ts +0 -91
  448. package/dist/services/AgentSessionService.d.ts.map +0 -1
  449. package/dist/services/AgentSessionService.js +0 -282
  450. package/dist/services/AgentSessionService.js.map +0 -1
  451. package/dist/services/BridgeBatchPipeline.d.ts +0 -103
  452. package/dist/services/BridgeBatchPipeline.d.ts.map +0 -1
  453. package/dist/services/BridgeBatchPipeline.js +0 -295
  454. package/dist/services/BridgeBatchPipeline.js.map +0 -1
  455. package/dist/services/BridgeQueueStore.d.ts +0 -28
  456. package/dist/services/BridgeQueueStore.d.ts.map +0 -1
  457. package/dist/services/BridgeQueueStore.js +0 -88
  458. package/dist/services/BridgeQueueStore.js.map +0 -1
  459. package/dist/services/CSSTokenWriter.d.ts +0 -22
  460. package/dist/services/CSSTokenWriter.d.ts.map +0 -1
  461. package/dist/services/CSSTokenWriter.js +0 -116
  462. package/dist/services/CSSTokenWriter.js.map +0 -1
  463. package/dist/services/DesignTokenService.d.ts +0 -39
  464. package/dist/services/DesignTokenService.d.ts.map +0 -1
  465. package/dist/services/DesignTokenService.js +0 -100
  466. package/dist/services/DesignTokenService.js.map +0 -1
  467. package/dist/services/InlineVariantGenerationService.d.ts +0 -51
  468. package/dist/services/InlineVariantGenerationService.d.ts.map +0 -1
  469. package/dist/services/InlineVariantGenerationService.js +0 -475
  470. package/dist/services/InlineVariantGenerationService.js.map +0 -1
  471. package/dist/services/InterfaceGenerationService.d.ts +0 -12
  472. package/dist/services/InterfaceGenerationService.d.ts.map +0 -1
  473. package/dist/services/InterfaceGenerationService.js +0 -256
  474. package/dist/services/InterfaceGenerationService.js.map +0 -1
  475. package/dist/services/TailwindConfigWriter.d.ts +0 -24
  476. package/dist/services/TailwindConfigWriter.d.ts.map +0 -1
  477. package/dist/services/TailwindConfigWriter.js +0 -105
  478. package/dist/services/TailwindConfigWriter.js.map +0 -1
  479. package/dist/services/TerminalAgentRunner.d.ts +0 -65
  480. package/dist/services/TerminalAgentRunner.d.ts.map +0 -1
  481. package/dist/services/TerminalAgentRunner.js +0 -511
  482. package/dist/services/TerminalAgentRunner.js.map +0 -1
  483. package/dist/services/VisualVariantAgentRunner.d.ts +0 -20
  484. package/dist/services/VisualVariantAgentRunner.d.ts.map +0 -1
  485. package/dist/services/VisualVariantAgentRunner.js +0 -66
  486. package/dist/services/VisualVariantAgentRunner.js.map +0 -1
  487. package/dist/services/adapters/TailwindCSSTokenAdapter.d.ts +0 -35
  488. package/dist/services/adapters/TailwindCSSTokenAdapter.d.ts.map +0 -1
  489. package/dist/services/adapters/TailwindCSSTokenAdapter.js +0 -278
  490. package/dist/services/adapters/TailwindCSSTokenAdapter.js.map +0 -1
  491. package/dist/services/agent/AgentCore.d.ts +0 -126
  492. package/dist/services/agent/AgentCore.d.ts.map +0 -1
  493. package/dist/services/agent/AgentCore.js +0 -759
  494. package/dist/services/agent/AgentCore.js.map +0 -1
  495. package/dist/services/agent/AgentModService.d.ts +0 -98
  496. package/dist/services/agent/AgentModService.d.ts.map +0 -1
  497. package/dist/services/agent/AgentModService.js +0 -400
  498. package/dist/services/agent/AgentModService.js.map +0 -1
  499. package/dist/services/agent/index.d.ts +0 -2
  500. package/dist/services/agent/index.d.ts.map +0 -1
  501. package/dist/services/agent/index.js +0 -6
  502. package/dist/services/agent/index.js.map +0 -1
  503. package/dist/types/editor-interface-types.d.ts +0 -67
  504. package/dist/types/editor-interface-types.d.ts.map +0 -1
  505. package/dist/types/editor-interface-types.js +0 -12
  506. package/dist/types/editor-interface-types.js.map +0 -1
  507. package/dist/utils/elementRefToContext.d.ts +0 -4
  508. package/dist/utils/elementRefToContext.d.ts.map +0 -1
  509. package/dist/utils/elementRefToContext.js +0 -63
  510. package/dist/utils/elementRefToContext.js.map +0 -1
  511. package/dist/utils/skills/shared-variants-protocol.d.ts +0 -69
  512. package/dist/utils/skills/shared-variants-protocol.d.ts.map +0 -1
  513. package/dist/utils/skills/shared-variants-protocol.js +0 -292
  514. package/dist/utils/skills/shared-variants-protocol.js.map +0 -1
  515. package/src/ui/dist/assets/main-CLAqO1bm.js +0 -656
  516. package/src/ui/dist/assets/main-Ke-Q9lWa.css +0 -1
  517. /package/dist/{mcp/agent-variants → agent-variants}/briefContent.d.ts +0 -0
  518. /package/dist/{mcp/agent-variants → agent-variants}/briefContent.js +0 -0
  519. /package/dist/{mcp/agent-variants → agent-variants}/createProjectArtifacts.d.ts +0 -0
  520. /package/dist/{mcp/agent-variants → agent-variants}/createProjectArtifacts.js +0 -0
  521. /package/dist/{mcp/agent-variants → agent-variants}/diffQa.d.ts +0 -0
  522. /package/dist/{mcp/agent-variants → agent-variants}/diffQa.js +0 -0
  523. /package/dist/{mcp/agent-variants → agent-variants}/elementRefToTarget.js +0 -0
  524. /package/dist/{mcp/agent-variants → agent-variants}/errors.d.ts +0 -0
  525. /package/dist/{mcp/agent-variants → agent-variants}/errors.js +0 -0
  526. /package/dist/{mcp/agent-variants → agent-variants}/previewQa.d.ts +0 -0
  527. /package/dist/{mcp/agent-variants → agent-variants}/previewQa.js +0 -0
  528. /package/dist/{mcp/agent-variants → agent-variants}/runLabel.d.ts +0 -0
  529. /package/dist/{mcp/agent-variants → agent-variants}/runLabel.js +0 -0
  530. /package/dist/{mcp/agent-variants → agent-variants}/runPlan.d.ts +0 -0
  531. /package/dist/{mcp/agent-variants → agent-variants}/runPlan.js +0 -0
  532. /package/dist/{mcp/agent-variants → agent-variants}/sourceContext.d.ts +0 -0
  533. /package/dist/{mcp/agent-variants → agent-variants}/sourceContext.js +0 -0
  534. /package/dist/{mcp/agent-variants → agent-variants}/variantContext.d.ts +0 -0
  535. /package/dist/{mcp/agent-variants → agent-variants}/variantContext.js +0 -0
@@ -1,1165 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.normalizeAgentOutput = exports.slugifyPrompt = void 0;
7
- exports.registerAgentVariantsTools = registerAgentVariantsTools;
8
- exports.buildQaFailurePrompt = buildQaFailurePrompt;
9
- exports.buildRegeneratePrompt = buildRegeneratePrompt;
10
- const path_1 = __importDefault(require("path"));
11
- const crypto_1 = require("crypto");
12
- const variantContext_1 = require("./variantContext");
13
- const contracts_1 = require("./contracts");
14
- const VariantHistoryService_1 = require("../../services/VariantHistoryService");
15
- const errors_1 = require("./errors");
16
- const generatedDestination_1 = require("./generatedDestination");
17
- Object.defineProperty(exports, "slugifyPrompt", { enumerable: true, get: function () { return generatedDestination_1.slugifyPrompt; } });
18
- const createZeroToOneTool_1 = require("./createZeroToOneTool");
19
- const ProjectDetectionService_1 = require("../../services/ProjectDetectionService");
20
- const BrowserAgentClient_1 = require("../../services/BrowserAgentClient");
21
- /**
22
- * Coerce `output` to a structured value when an agent (incorrectly) sends a
23
- * stringified JSON. The MCP schema accepts `z.unknown()` so the call doesn't
24
- * fail validation, but downstream consumers (e.g. `output.html` in
25
- * WorktreeOrchestrator) expect an object and silently no-op on strings —
26
- * leaving the variant stuck at "not ready" until session expiry.
27
- */
28
- const normalizeAgentOutput = (output) => {
29
- if (typeof output !== 'string')
30
- return output;
31
- try {
32
- return JSON.parse(output);
33
- }
34
- catch {
35
- return output;
36
- }
37
- };
38
- exports.normalizeAgentOutput = normalizeAgentOutput;
39
- /** Builds the required host-agent action for a live visual editor session. */
40
- const buildVisualEditorWatchAction = (sessionId, timing) => ({
41
- tool: 'watch_for_changes',
42
- arguments: { sessionId },
43
- required: true,
44
- timing,
45
- loopUntil: 'close_visual_editor',
46
- onTimeout: 'call_again',
47
- afterHandlingChanges: 'call_again',
48
- });
49
- const manifestKind = (manifest) => {
50
- return manifest.artifact.kind === 'diff' ? 'diff' : 'project-created';
51
- };
52
- const normalizeEvidenceUrl = (url) => {
53
- try {
54
- return new URL(url).href;
55
- }
56
- catch {
57
- return url;
58
- }
59
- };
60
- const startVariantsTelemetryFor = (args) => {
61
- const userContext = args.userContext ?? [];
62
- const mode = args.mode === 'zero_to_one'
63
- ? userContext.length > 0
64
- ? 'source_grounded'
65
- : 'zero_to_one'
66
- : args.sourceVariantId
67
- ? 'vary'
68
- : 'initial_generation';
69
- return {
70
- requestId: args.requestId,
71
- entryPoint: 'mcp_tool',
72
- mode,
73
- projectContextKind: args.mode === 'zero_to_one' ? 'fresh' : 'existing',
74
- requestedCount: args.briefs?.length ?? args.count,
75
- sourceCount: userContext.length,
76
- sourceUrlCount: userContext.filter((source) => source.transport === 'url')
77
- .length,
78
- sourceFileCount: userContext.filter((source) => source.transport === 'file_path').length,
79
- sourceDirectoryCount: userContext.filter((source) => source.transport === 'directory_path').length,
80
- sourceTextCount: userContext.filter((source) => source.transport === 'text')
81
- .length,
82
- briefCount: args.briefs?.length,
83
- briefLabelCount: args.briefs?.filter((brief) => brief.label.length > 0)
84
- .length,
85
- instructionLength: args.prompt.length,
86
- };
87
- };
88
- const evidenceKey = (url) => normalizeEvidenceUrl(url);
89
- const designSystemMetadataBySourceId = (sourcePlan) => {
90
- const bySourceId = new Map();
91
- for (const metadata of sourcePlan.metadata) {
92
- if (metadata.kind !== 'design_system')
93
- continue;
94
- for (const sourceId of metadata.sourceIds) {
95
- bySourceId.set(sourceId, [...(bySourceId.get(sourceId) ?? []), metadata]);
96
- }
97
- }
98
- return bySourceId;
99
- };
100
- const urlDesignSourceIds = (sourcePlan) => {
101
- const sourceIds = new Set();
102
- for (const action of sourcePlan.actions) {
103
- if (action.kind !== 'extract_design_system')
104
- continue;
105
- action.sourceIds.forEach((sourceId) => sourceIds.add(sourceId));
106
- }
107
- for (const metadata of sourcePlan.metadata) {
108
- if (metadata.kind !== 'design_system')
109
- continue;
110
- metadata.sourceIds.forEach((sourceId) => sourceIds.add(sourceId));
111
- }
112
- return sourceIds;
113
- };
114
- /**
115
- * Requires every URL-backed design-system source to prove the browser evidence
116
- * route was attempted before source planning is accepted.
117
- */
118
- const assertBrowserEvidenceForUrlDesignSources = (args) => {
119
- const workItemInput = args.workItemInput;
120
- const urlSourcesById = new Map();
121
- for (const source of workItemInput.userContext ?? []) {
122
- if (source.transport === 'url' &&
123
- typeof source.id === 'string' &&
124
- typeof source.url === 'string') {
125
- urlSourcesById.set(source.id, source.url);
126
- }
127
- }
128
- const metadataBySourceId = designSystemMetadataBySourceId(args.sourcePlan);
129
- for (const sourceId of urlDesignSourceIds(args.sourcePlan)) {
130
- const sourceUrl = urlSourcesById.get(sourceId);
131
- if (!sourceUrl)
132
- continue;
133
- const attempt = args.attempts.get(evidenceKey(sourceUrl));
134
- if (!attempt) {
135
- throw new errors_1.AgentVariantsError('SOURCE_CONTEXT_INVALID', `URL source ${sourceId} must call capture_design_evidence before report_work_item(kind='source_plan').`);
136
- }
137
- const metadata = metadataBySourceId.get(sourceId) ?? [];
138
- for (const entry of metadata) {
139
- if (!entry.data.evidenceStatus) {
140
- throw new errors_1.AgentVariantsError('SOURCE_CONTEXT_INVALID', `design_system metadata ${entry.id} must set data.evidenceStatus after capture_design_evidence.`);
141
- }
142
- if (attempt.evidenceStatus === 'inferred' &&
143
- entry.data.evidenceStatus !== 'inferred') {
144
- throw new errors_1.AgentVariantsError('SOURCE_CONTEXT_INVALID', `design_system metadata ${entry.id} cannot claim captured browser evidence after capture_design_evidence returned no rendered evidence.`);
145
- }
146
- }
147
- }
148
- };
149
- const registerVariantTool = (mcp, name, description, input, handler) => {
150
- const tool = mcp.tool.bind(mcp);
151
- tool(name, description, input, handler);
152
- };
153
- function registerAgentVariantsTools(mcp, deps) {
154
- const browserEvidenceAttemptsBySession = new Map();
155
- const browserEvidenceAttemptsByUrl = new Map();
156
- const recordBrowserEvidenceAttempt = (sessionId, url, attempt) => {
157
- browserEvidenceAttemptsByUrl.set(evidenceKey(url), attempt);
158
- if (!sessionId)
159
- return;
160
- const sessionAttempts = browserEvidenceAttemptsBySession.get(sessionId) ?? new Map();
161
- sessionAttempts.set(evidenceKey(url), attempt);
162
- browserEvidenceAttemptsBySession.set(sessionId, sessionAttempts);
163
- };
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) => {
168
- try {
169
- const reported = deps.orchestrator.reportBriefs({
170
- sessionId: args.sessionId,
171
- workItemId: args.workItemId,
172
- attempt: args.attempt,
173
- leaseId: args.leaseId,
174
- briefs: args.briefs,
175
- bindings: args.bindings,
176
- });
177
- // Start every reported brief immediately — no in-chat approval gate.
178
- // Mirrors start_variants' single-call kickoff so directions begin
179
- // generating without waiting on user confirmation.
180
- const approved = await deps.orchestrator.approve({
181
- sessionId: args.sessionId,
182
- selections: reported.briefs.map((b) => ({ briefId: b.briefId })),
183
- });
184
- const out = {
185
- stage: 'work_items_ready',
186
- approvedCount: approved.approvedCount,
187
- codeGenWorkItemIds: approved.codeGenWorkItemIds,
188
- scaffoldBaseWorkItemId: approved.scaffoldBaseWorkItemId ?? null,
189
- nextAction: 'continue_variants',
190
- };
191
- return jsonResponse(out);
192
- }
193
- catch (err) {
194
- return errorResponse(err);
195
- }
196
- };
197
- const handleReportSourcePlan = async (args) => {
198
- try {
199
- const attempts = new Map(browserEvidenceAttemptsByUrl);
200
- const sessionAttempts = browserEvidenceAttemptsBySession.get(args.sessionId);
201
- for (const [key, attempt] of sessionAttempts ?? []) {
202
- attempts.set(key, attempt);
203
- }
204
- assertBrowserEvidenceForUrlDesignSources({
205
- sourcePlan: args.sourcePlan,
206
- workItemInput: deps.orchestrator.getWorkItemInput(args.sessionId, args.workItemId),
207
- attempts,
208
- });
209
- const result = deps.orchestrator.reportSourcePlan({
210
- sessionId: args.sessionId,
211
- workItemId: args.workItemId,
212
- leaseId: args.leaseId,
213
- attempt: args.attempt,
214
- sourcePlan: args.sourcePlan,
215
- });
216
- const plan = args.sourcePlan.executionPlan;
217
- const out = {
218
- stage: 'awaiting_briefs',
219
- briefWorkItem: {
220
- id: result.briefWorkItem.id,
221
- kind: 'brief',
222
- attempt: result.briefWorkItem.attempt,
223
- input: result.briefWorkItem.input,
224
- output_schema: {
225
- 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"}>',
226
- },
227
- },
228
- executionPlan: {
229
- mode: plan.mode,
230
- confidence: plan.confidence,
231
- reason: plan.reason,
232
- assetCount: plan.assetPlan?.length ?? 0,
233
- runtimeRequirementCount: plan.runtimeRequirements?.length ?? 0,
234
- },
235
- nextAction: 'report_work_item',
236
- };
237
- return jsonResponse(out);
238
- }
239
- catch (err) {
240
- return errorResponse(err);
241
- }
242
- };
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) => {
244
- try {
245
- const client = deps.browserAgentClient ?? new BrowserAgentClient_1.BrowserAgentClient();
246
- const result = await client.captureDesignEvidence(args.url, {
247
- viewport: args.viewport,
248
- screenshot: true,
249
- });
250
- if (!result.ok) {
251
- recordBrowserEvidenceAttempt(args.sessionId, args.url, {
252
- evidenceStatus: 'inferred',
253
- available: result.available,
254
- });
255
- const out = {
256
- ok: false,
257
- available: result.available,
258
- evidenceStatus: 'inferred',
259
- reason: result.reason,
260
- guidance: result.available
261
- ? 'The browser agent is enabled but this render failed (likely transient). You may retry capture_design_evidence once; if it still fails, inspect the URL natively and report design_system with data.evidenceStatus = "inferred".'
262
- : 'No browser agent is available. Inspect the URL natively (read whatever static content you can) and report design_system with data.evidenceStatus = "inferred" — do not present inferred values as extracted.',
263
- };
264
- return jsonResponse(out);
265
- }
266
- const { evidence } = result;
267
- // The renderer only emits 'inferred' on hard failure (ok=false); any
268
- // successful render is at least 'partial'.
269
- const evidenceStatus = evidence.evidenceStatus === 'captured' ? 'captured' : 'partial';
270
- recordBrowserEvidenceAttempt(args.sessionId, args.url, {
271
- evidenceStatus,
272
- available: true,
273
- });
274
- const guidance = [
275
- `Rendered design evidence for ${evidence.finalUrl} (evidenceStatus: ${evidenceStatus}).`,
276
- 'Synthesize design_system.data.designMarkdown from this evidence; set data.evidenceStatus to the value above.',
277
- '- Map role-named :root variables to DESIGN.md roles (--primary, --background, --foreground, --muted, --accent, --border, --ring, --card, --radius, ...).',
278
- '- Resolve shadcn HSL-triplet tokens: a value like "0 0% 9%" means hsl(0 0% 9%) — convert to a concrete color.',
279
- '- Read the display font from the heading element styles and the body font from body/paragraph; do not scrape font URLs.',
280
- '- Use the screenshot to pick the brand/accent color and capture the overall feel where tokens are ambiguous.',
281
- '- Mark only genuinely-unobservable values as unknown; do not invent responsive/motion/elevation behavior absent from the evidence.',
282
- ].join('\n');
283
- const payload = {
284
- finalUrl: evidence.finalUrl,
285
- evidenceStatus,
286
- rootVariables: evidence.rootVariables,
287
- elementStyles: evidence.elementStyles,
288
- fonts: evidence.fonts,
289
- warnings: evidence.warnings,
290
- };
291
- const content = [
292
- {
293
- type: 'text',
294
- text: `${guidance}\n\nEVIDENCE:\n${JSON.stringify(payload, null, 2)}`,
295
- },
296
- ];
297
- if (evidence.screenshotBase64) {
298
- content.push({
299
- type: 'image',
300
- data: evidence.screenshotBase64,
301
- mimeType: 'image/png',
302
- });
303
- }
304
- return { content };
305
- }
306
- catch (err) {
307
- recordBrowserEvidenceAttempt(args.sessionId, args.url, {
308
- evidenceStatus: 'inferred',
309
- available: true,
310
- });
311
- const out = {
312
- ok: false,
313
- available: true,
314
- evidenceStatus: 'inferred',
315
- reason: err instanceof Error
316
- ? err.message
317
- : 'Browser evidence capture failed.',
318
- guidance: 'The browser evidence capture attempt failed unexpectedly. Inspect the URL natively and report design_system with data.evidenceStatus = "inferred" — do not present inferred values as extracted.',
319
- };
320
- return jsonResponse(out);
321
- }
322
- });
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) => {
324
- try {
325
- assertExplicitUserConfirmation('commit_variant', args, 'commit a variant');
326
- const isVariantSendEnabled = deps.isVariantSendEnabled === undefined
327
- ? true
328
- : await deps.isVariantSendEnabled();
329
- if (!isVariantSendEnabled) {
330
- deps.telemetry?.trackAgentVariantsCommitFailed?.({
331
- sessionId: args.sessionId,
332
- targetVariantId: args.variantId,
333
- mode: 'commit',
334
- requestStatus: 'failed',
335
- failureReason: 'feature_disabled',
336
- });
337
- throw new errors_1.AgentVariantsError('INVALID_STAGE_ACTION', 'Variant send is not enabled.');
338
- }
339
- const result = await deps.orchestrator.commitVariant({
340
- sessionId: args.sessionId,
341
- variantId: args.variantId,
342
- });
343
- const out = {
344
- stage: deps.orchestrator.getStage(args.sessionId),
345
- enqueued: result.enqueued,
346
- duplicate: result.duplicate,
347
- changedFilesCount: result.changedFilesCount,
348
- payloadKind: result.payloadKind,
349
- destinationPath: result.destinationPath,
350
- };
351
- return jsonResponse(out);
352
- }
353
- catch (err) {
354
- return errorResponse(err);
355
- }
356
- });
357
- /**
358
- * Snapshot the variant-request FIFO depth at response-build time as the
359
- * `pendingVariantRequests` field. Read AFTER any batch a call consumed, so it
360
- * tells the agent how many MORE batches are still queued (`> 0` ⇒ keep
361
- * draining). Returns an empty object when no accessor is wired (unit tests).
362
- */
363
- const pendingVariantRequestsField = () => deps.pendingVariantRequestCount
364
- ? { pendingVariantRequests: deps.pendingVariantRequestCount() }
365
- : {};
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) => {
367
- try {
368
- const stage = deps.orchestrator.getStage(args.sessionId);
369
- if (args.action === 'refine_variant') {
370
- if (!args.variantId || !args.instruction) {
371
- throw new errors_1.AgentVariantsError('MISSING_REQUIRED_INPUT', 'continue_variants(action="refine_variant") requires variantId and instruction');
372
- }
373
- const lease = deps.orchestrator.refineVariant({
374
- sessionId: args.sessionId,
375
- variantId: args.variantId,
376
- instruction: args.instruction,
377
- leaseOwner: deps.leaseOwner(),
378
- });
379
- return jsonResponse({
380
- stage: 'work_items_ready',
381
- leaseId: lease.leaseId,
382
- leaseTtlMs: lease.leaseTtlMs,
383
- leasedWorkItems: lease.leasedWorkItems,
384
- });
385
- }
386
- if (stage === 'awaiting_briefs') {
387
- // continue_variants while still awaiting briefs means the agent
388
- // hasn't run the brief work item yet — that's a programming error.
389
- throw new errors_1.AgentVariantsError('INVALID_STAGE_ACTION', "Run the brief work item and call report_work_item(kind='brief') before continue_variants");
390
- }
391
- if (stage === 'awaiting_approval') {
392
- const briefs = deps.orchestrator.getBriefs(args.sessionId);
393
- return jsonResponse({
394
- stage: 'awaiting_approval',
395
- briefs,
396
- approvalPrompt: buildApprovalPrompt(briefs),
397
- });
398
- }
399
- if (args.action === 'request_work' &&
400
- (stage === 'awaiting_source_plan' ||
401
- stage === 'work_items_ready' ||
402
- stage === 'waiting_for_results')) {
403
- // SessionStore.requestWork accepts both stages and expires stale
404
- // leases before issuing new ones, so this also recycles wedged
405
- // variants whose leases expired while the session was already in
406
- // waiting_for_results.
407
- const lease = deps.orchestrator.requestWork({
408
- sessionId: args.sessionId,
409
- leaseOwner: deps.leaseOwner(),
410
- requestedLeaseCount: args.requestedLeaseCount,
411
- ...(args.workItemIds ? { workItemIds: args.workItemIds } : {}),
412
- });
413
- const postLeaseStage = deps.orchestrator.getStage(args.sessionId);
414
- const leasePayload = {
415
- leaseId: lease.leaseId,
416
- leaseTtlMs: lease.leaseTtlMs,
417
- leasedWorkItems: lease.leasedWorkItems,
418
- ...pendingVariantRequestsField(),
419
- };
420
- return jsonResponse(postLeaseStage === 'awaiting_source_plan'
421
- ? { stage: 'awaiting_source_plan', ...leasePayload }
422
- : { stage: 'work_items_ready', ...leasePayload });
423
- }
424
- if (stage === 'work_items_ready' || stage === 'waiting_for_results') {
425
- return jsonResponse({
426
- stage: 'waiting_for_results',
427
- progress: deps.orchestrator.getProgress(args.sessionId),
428
- ...pendingVariantRequestsField(),
429
- });
430
- }
431
- if (stage === 'awaiting_source_plan') {
432
- return jsonResponse({
433
- stage: 'awaiting_source_plan',
434
- progress: deps.orchestrator.getProgress(args.sessionId),
435
- ...pendingVariantRequestsField(),
436
- });
437
- }
438
- // Terminal stages
439
- {
440
- const summary = deps.orchestrator.getSummary(args.sessionId);
441
- const variants = deps.orchestrator.getVariants(args.sessionId);
442
- const previewUrls = variants
443
- .filter((v) => v.preview?.kind === 'static_artifact')
444
- .map((v) => ({
445
- label: v.label,
446
- url: v.preview.url,
447
- }));
448
- const qaSurfacing = buildQaSurfacing(variants);
449
- return jsonResponse({
450
- stage,
451
- summary,
452
- ...(previewUrls.length > 0 ? { previewUrls } : {}),
453
- ...qaSurfacing,
454
- ...pendingVariantRequestsField(),
455
- });
456
- }
457
- }
458
- catch (err) {
459
- return errorResponse(err);
460
- }
461
- });
462
- const handleReportComplete = async (args) => {
463
- try {
464
- const result = await deps.orchestrator.reportComplete({
465
- sessionId: args.sessionId,
466
- workItemId: args.workItemId,
467
- leaseId: args.leaseId,
468
- attempt: args.attempt,
469
- status: args.status,
470
- output: (0, exports.normalizeAgentOutput)(args.output),
471
- error: args.error,
472
- tokensIn: args.tokensIn,
473
- tokensOut: args.tokensOut,
474
- model: args.model,
475
- title: args.title,
476
- description: args.description,
477
- });
478
- deps.completeVariantRequestWork?.({
479
- sessionId: args.sessionId,
480
- workItemId: args.workItemId,
481
- status: args.status,
482
- requeuedForRegeneration: result.requeuedForRegeneration,
483
- aborted: result.aborted,
484
- });
485
- let out;
486
- if (result.aborted) {
487
- // The work item was removed/cancelled mid-flight. Tell the agent to
488
- // drop it now rather than retry against a cleared lease.
489
- out = {
490
- aborted: true,
491
- stage: result.stage,
492
- progress: result.progress,
493
- };
494
- }
495
- else if (result.stage === 'ready' ||
496
- result.stage === 'degraded' ||
497
- result.stage === 'failed' ||
498
- result.stage === 'cancelled') {
499
- const summary = result.summary ?? deps.orchestrator.getSummary(args.sessionId);
500
- const variants = deps.orchestrator.getVariants(args.sessionId);
501
- const previewUrls = variants
502
- .filter((v) => v.preview?.kind === 'static_artifact')
503
- .map((v) => ({
504
- label: v.label,
505
- url: v.preview.url,
506
- }));
507
- const qaSurfacing = buildQaSurfacing(variants);
508
- out = {
509
- stage: result.stage,
510
- summary,
511
- ...(previewUrls.length > 0 ? { previewUrls } : {}),
512
- ...qaSurfacing,
513
- };
514
- }
515
- else if (result.requeuedForRegeneration) {
516
- // The variant was rejected by the diff QA gate and reset to
517
- // pending for its one regeneration. Tell the agent explicitly to
518
- // re-lease and regenerate — a bare waiting_for_results reply looks
519
- // identical to a sibling still in flight, so without this the agent
520
- // abandons the variant and the session sticks at ready:0.
521
- const label = deps.orchestrator
522
- .getVariants(args.sessionId)
523
- .find((v) => v.workItemId === args.workItemId)?.label;
524
- out = {
525
- stage: 'waiting_for_results',
526
- progress: result.progress,
527
- regenerate: true,
528
- qaPrompt: buildRegeneratePrompt(label, result.qa),
529
- ...(result.qa
530
- ? { qa: [{ workItemId: args.workItemId, label, qa: result.qa }] }
531
- : {}),
532
- };
533
- }
534
- else {
535
- out = {
536
- stage: 'waiting_for_results',
537
- progress: result.progress,
538
- };
539
- }
540
- return jsonResponse(out);
541
- }
542
- catch (err) {
543
- return errorResponse(err);
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
- }
599
- });
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) => {
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
- }
617
- const result = await deps.orchestrator.cancel({
618
- sessionId: args.sessionId,
619
- reason: args.reason,
620
- });
621
- const out = {
622
- stage: 'cancelled',
623
- cleanupStatus: result.cleanupStatus,
624
- };
625
- return jsonResponse(out);
626
- }
627
- catch (err) {
628
- return errorResponse(err);
629
- }
630
- });
631
- registerVariantTool(mcp, 'start_variants', 'Single-call kickoff for variants exploration, and the single entry point for fresh projects. Spawns N variant worktrees, opens the visual editor, and returns the variant work items + worktreePaths — no follow-up open_visual_editor / continue_variants needed for the initial generation lease. Pass `briefs` (one per variant) so each card has a distinct, plain-English name (a 1–5 word title naming what the direction changes) and description; omitting them derives a shared run-intent label per variant from `runLabel`/the prompt (e.g. "Brighter 1", "Brighter 2") with the prompt as each description — the same fallback for fresh and existing. Also pass `runLabel` — a 1–2 word label for the whole run\'s intent (e.g. prompt "make it brighter" → "Brighter"), shown as a tag on every variant row. `briefs.length` sets the count. mode="existing" for existing projects, "zero_to_one" for fresh projects. For source-grounded runs pass `userContext` — an array of raw sources ({transport:"url",url} | {transport:"file_path",path} | {transport:"directory_path",path} | {transport:"text",content}). With mode="zero_to_one" this runs the source-research flow and returns stage="awaiting_source_plan" instead of work_items_ready; with mode="existing" the raw context is threaded into each variant\'s code-gen. When the response includes visualEditor/editorNextAction, start or resume the hosted watch_for_changes loop on visualEditor.sessionId; direct start_variants is a kickoff tool, not a durable watcher. Full protocol in the rivet skill.', contracts_1.startVariantsInput, async (args) => {
632
- const requestTelemetry = startVariantsTelemetryFor(args);
633
- deps.telemetry?.trackAgentVariantsRequestStarted?.(requestTelemetry);
634
- try {
635
- const out = args.mode === 'zero_to_one'
636
- ? await handleStartVariantsZeroToOne(args, deps)
637
- : await handleStartVariantsExisting(args, deps);
638
- if (out.stage === 'failed') {
639
- deps.telemetry?.trackAgentVariantsRequestRejected?.({
640
- ...requestTelemetry,
641
- failureReason: out.errorCode,
642
- });
643
- return jsonResponse(out);
644
- }
645
- deps.telemetry?.trackAgentVariantsRequestAccepted?.({
646
- ...requestTelemetry,
647
- sessionId: out.sessionId,
648
- requestStatus: 'accepted',
649
- acceptedCount: out.stage === 'work_items_ready'
650
- ? out.variants.length
651
- : requestTelemetry.requestedCount,
652
- workItemCount: out.stage === 'work_items_ready'
653
- ? out.variants.length
654
- : undefined,
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?.();
659
- return jsonResponse(out);
660
- }
661
- catch (err) {
662
- deps.telemetry?.trackAgentVariantsRequestRejected?.({
663
- ...requestTelemetry,
664
- failureReason: err,
665
- });
666
- return errorResponse(err);
667
- }
668
- });
669
- const variantHistory = deps.variantHistory ?? new VariantHistoryService_1.VariantHistoryService();
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) => {
681
- try {
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);
733
- }
734
- const entries = await variantHistory.listVariants({
735
- projectPath,
736
- limit: args.limit,
737
- status: args.status,
738
- });
739
- // Removed and cancelled variants are retained on disk but never
740
- // surfaced in the default history listing — only when explicitly
741
- // queried with the matching status filter.
742
- const visibleEntries = args.status === 'removed'
743
- ? entries
744
- : entries.filter((entry) => entry.manifest.status !== 'removed' &&
745
- (args.status === 'cancelled' ||
746
- entry.manifest.status !== 'cancelled'));
747
- const summaries = visibleEntries.map((entry) => ({
748
- sessionId: entry.manifest.sessionId,
749
- variantId: entry.manifest.variantId,
750
- ...(entry.manifest.requestId
751
- ? { requestId: entry.manifest.requestId }
752
- : {}),
753
- label: entry.manifest.label,
754
- brief: entry.manifest.brief,
755
- kind: manifestKind(entry.manifest),
756
- status: entry.manifest.status,
757
- createdAt: entry.manifest.createdAt,
758
- statusChangedAt: entry.manifest.statusChangedAt,
759
- changedFilesCount: entry.manifest.changedFilesCount,
760
- artifact: entry.manifest.artifact,
761
- preview: entry.manifest.preview,
762
- }));
763
- const out = {
764
- projectPath,
765
- variants: summaries,
766
- };
767
- return jsonResponse(out);
768
- }
769
- catch (err) {
770
- return errorResponse(err);
771
- }
772
- });
773
- }
774
- // --- Helpers --------------------------------------------------------------
775
- // Return type is left implicit so the MCP SDK's overload selection picks the
776
- // raw-shape variant; tagging an explicit interface here breaks the index
777
- // signature the SDK expects.
778
- function jsonResponse(payload) {
779
- return {
780
- content: [
781
- {
782
- type: 'text',
783
- text: JSON.stringify(payload),
784
- },
785
- ],
786
- };
787
- }
788
- function errorResponse(err) {
789
- const code = err instanceof errors_1.AgentVariantsError ? err.code : 'SCHEMA_VALIDATION_FAILED';
790
- const message = err instanceof Error ? err.message : 'Unknown error in agent-variants tool';
791
- return {
792
- content: [
793
- {
794
- type: 'text',
795
- text: JSON.stringify({
796
- stage: 'failed',
797
- errorCode: code,
798
- message,
799
- }),
800
- },
801
- ],
802
- isError: true,
803
- };
804
- }
805
- function assertExplicitUserConfirmation(toolName, confirmation, actionLabel) {
806
- if (confirmation.confirmedByUser) {
807
- return;
808
- }
809
- if (confirmation.bypassRequestedByUser &&
810
- confirmation.bypassReason?.trim().length) {
811
- return;
812
- }
813
- throw new errors_1.AgentVariantsError('MISSING_REQUIRED_INPUT', `${toolName} requires explicit user confirmation to ${actionLabel}. Set confirmedByUser=true after user confirmation, or set bypassRequestedByUser=true with bypassReason when the user explicitly asks to bypass.`);
814
- }
815
- function buildApprovalPrompt(briefs) {
816
- const formattedBriefs = briefs
817
- .map((brief, index) => `${index + 1}. name: ${brief.label}\n description: ${brief.body}`)
818
- .join('\n');
819
- return (`Review these variant briefs:\n${formattedBriefs}\n\n` +
820
- 'Do these look good, or do you want any adjustments before I proceed?');
821
- }
822
- /**
823
- * Compose the QA surfacing block (`qaPrompt`, `qa[]`) attached to terminal
824
- * tool responses. Returns an empty object when no variant has a recorded
825
- * QA verdict so existing-project flows (which never trigger preview QA)
826
- * remain a no-op.
827
- *
828
- * Exported indirectly via the orchestrator's terminal tool responses so
829
- * the calling agent can show the user a concrete retry/continue/cancel
830
- * choice when one or more variants fail QA.
831
- */
832
- function buildQaSurfacing(variants) {
833
- const withQa = variants.filter((v) => Boolean(v.qa) && v.qa.status !== 'not_run');
834
- if (withQa.length === 0)
835
- return {};
836
- const qaEntries = withQa.map((v) => ({
837
- workItemId: v.workItemId,
838
- label: v.label,
839
- qa: v.qa,
840
- }));
841
- const failures = withQa.filter((v) => v.qa.status === 'failed');
842
- if (failures.length === 0) {
843
- return { qa: qaEntries };
844
- }
845
- return {
846
- qa: qaEntries,
847
- qaPrompt: buildQaFailurePrompt(failures.map((v) => ({ label: v.label, qa: v.qa })), withQa.length - failures.length),
848
- };
849
- }
850
- /**
851
- * User-facing prompt template for QA failures. Lists each failed variant
852
- * with its summary + first asset/console issue, then asks the user
853
- * whether to retry, continue with healthy variants, or cancel. Kept as
854
- * data (not a log line) so the calling agent can present the choice
855
- * directly to the human.
856
- */
857
- function buildQaFailurePrompt(failures, healthyCount) {
858
- if (failures.length === 0) {
859
- return '';
860
- }
861
- const lines = failures.map((failure) => {
862
- const firstIssue = failure.qa.issues[0];
863
- const issueDetail = firstIssue
864
- ? ` (${describeIssue(firstIssue.kind)}: ${firstIssue.detail}${firstIssue.message ? ` — ${firstIssue.message}` : ''})`
865
- : '';
866
- return `• ${failure.label}: ${failure.qa.summary}${issueDetail}`;
867
- });
868
- const healthyLine = healthyCount > 0
869
- ? `\n\n${healthyCount} other variant${healthyCount === 1 ? '' : 's'} passed QA and can still be committed.`
870
- : '';
871
- const intro = failures.length === 1
872
- ? '1 variant failed QA:'
873
- : `${failures.length} variants failed QA:`;
874
- return `${intro}\n${lines.join('\n')}${healthyLine}\n\nWould you like to retry the failed variant${failures.length === 1 ? '' : 's'}, continue with healthy variants only, or cancel?`;
875
- }
876
- /**
877
- * Compose the agent-facing instruction for a variant the QA gate re-queued
878
- * for its single regeneration. Names the variant, surfaces the QA notes, and
879
- * spells out the exact next call so the agent re-leases and regenerates
880
- * instead of treating `waiting_for_results` as "nothing to do".
881
- */
882
- function buildRegeneratePrompt(label, qa) {
883
- const name = label ? `"${label}"` : 'This variant';
884
- const detail = qa?.summary;
885
- const notes = detail ? `\n\nQA notes: ${detail}` : '';
886
- return (`${name} did not pass the QA gate and was re-queued for ONE regeneration — ` +
887
- 'it is no longer counted as done. Call ' +
888
- "continue_variants(action='request_work') to re-lease it (it carries the " +
889
- "QA notes on its input), address the feedback, then report_work_item(kind='status') " +
890
- `again. This is its only retry.${notes}`);
891
- }
892
- const describeIssue = (kind) => {
893
- switch (kind) {
894
- case 'asset_load_failed':
895
- return 'asset load failed';
896
- case 'console_error':
897
- return 'console/runtime error';
898
- case 'preview_unavailable':
899
- return 'preview unavailable';
900
- case 'design_quality':
901
- return 'design quality below bar';
902
- }
903
- };
904
- /**
905
- * Handle the zero-to-one branch of `start_variants` — the single entry point
906
- * for fresh projects. Prompt-only sessions take the single-call path
907
- * (`startUnified` → `work_items_ready`). Source-grounded sessions (inspiration
908
- * URLs / source artifacts) delegate to `kickoffSourceGroundedZeroToOne`, which
909
- * runs the source-research flow and returns a multi-step `awaiting_*` stage.
910
- */
911
- async function handleStartVariantsZeroToOne(args, deps) {
912
- const framework = args.framework ?? 'vite';
913
- if (framework !== 'vite') {
914
- return {
915
- stage: 'failed',
916
- errorCode: 'UNSUPPORTED_FRAMEWORK',
917
- message: `start_variants(mode='zero_to_one') only supports framework='vite'; got '${framework}'.`,
918
- };
919
- }
920
- // Source-grounded sessions (raw user context — inspiration URLs, images,
921
- // videos, files, directories, or pasted text) need the source-research flow.
922
- // Route them through the shared kickoff, which returns a multi-step
923
- // `awaiting_*` stage rather than `work_items_ready` — the agent inspects raw
924
- // context, reports a source plan, then continues.
925
- const hasUserContext = (args.userContext?.length ?? 0) > 0;
926
- if (hasUserContext) {
927
- const out = await (0, createZeroToOneTool_1.kickoffSourceGroundedZeroToOne)({
928
- prompt: args.prompt,
929
- count: args.count,
930
- destinationParent: args.destinationParent,
931
- framework: args.framework,
932
- userContext: args.userContext,
933
- }, deps);
934
- if (out.stage === 'failed')
935
- return out;
936
- return {
937
- ...out,
938
- mode: 'zero_to_one',
939
- ...(out.visualEditor
940
- ? {
941
- editorNextAction: buildVisualEditorWatchAction(out.visualEditor.sessionId, 'after_variant_work_dispatch'),
942
- }
943
- : {}),
944
- };
945
- }
946
- // Prompt-only: single-call path. Shared destination derivation with the
947
- // source-grounded kickoff — resolve the destination parent (arg → open
948
- // editor project → cwd), slugify, collapse any nested `.rivet/`, and create
949
- // `<workspaceRoot>/.rivet/`.
950
- const cwd = deps.cwd ?? (() => process.cwd());
951
- const dest = (0, generatedDestination_1.deriveGeneratedDestination)({
952
- prompt: args.prompt,
953
- destinationParent: args.destinationParent,
954
- editorProjectPath: deps.getProjectPath?.() ?? undefined,
955
- cwd,
956
- });
957
- if (!dest.ok) {
958
- return {
959
- stage: 'failed',
960
- errorCode: dest.errorCode,
961
- message: dest.message,
962
- };
963
- }
964
- const { workspaceRoot, destinationPath } = dest;
965
- const projectContext = {
966
- kind: 'fresh',
967
- workspacePath: destinationPath,
968
- workspaceRoot,
969
- framework: 'vite',
970
- };
971
- const visualEditor = deps.ensureVisualEditorOpen
972
- ? await deps.ensureVisualEditorOpen({
973
- projectPath: destinationPath,
974
- workspaceRoot,
975
- framework: 'vite',
976
- })
977
- : undefined;
978
- const result = await deps.orchestrator.startUnified({
979
- prompt: args.prompt,
980
- count: args.count,
981
- target: args.target,
982
- projectContext,
983
- runLabel: args.runLabel,
984
- leaseOwner: deps.leaseOwner(),
985
- briefs: args.briefs,
986
- ...(args.requestId ? { requestId: args.requestId } : {}),
987
- });
988
- const response = assembleStartVariantsResponse({
989
- mode: 'zero_to_one',
990
- result,
991
- destinationPath,
992
- visualEditor,
993
- ...(deps.pendingVariantRequestCount
994
- ? { pendingVariantRequests: deps.pendingVariantRequestCount() }
995
- : {}),
996
- });
997
- claimStartVariantsRequestLease(args, deps, response);
998
- return response;
999
- }
1000
- /**
1001
- * Handle the existing-project branch of `start_variants`. Detects the
1002
- * project's framework server-side (cwd or the provided projectPath) so
1003
- * the agent doesn't need a separate project-detection call, auto-opens the
1004
- * visual editor on the resolved projectPath, and leases all variant
1005
- * work items so they're ready to code in the same response.
1006
- */
1007
- async function handleStartVariantsExisting(args, deps) {
1008
- const cwd = deps.cwd ?? (() => process.cwd());
1009
- const resolvedProjectPath = args.requestId
1010
- ? (deps.resolveVariantRequestProjectPath?.(args.requestId) ?? null)
1011
- : null;
1012
- if (args.requestId && !args.projectPath && !resolvedProjectPath) {
1013
- return {
1014
- stage: 'failed',
1015
- errorCode: 'SCHEMA_VALIDATION_FAILED',
1016
- message: `Could not resolve projectPath for requestId '${args.requestId}'. Pass projectPath explicitly or retry from the active visual editor session.`,
1017
- };
1018
- }
1019
- const projectPath = args.projectPath ?? resolvedProjectPath ?? cwd();
1020
- if (!path_1.default.isAbsolute(projectPath)) {
1021
- return {
1022
- stage: 'failed',
1023
- errorCode: 'SCHEMA_VALIDATION_FAILED',
1024
- message: `projectPath must be absolute; got '${projectPath}'.`,
1025
- };
1026
- }
1027
- let framework;
1028
- try {
1029
- framework = new ProjectDetectionService_1.ProjectDetectionService().detectFramework(projectPath);
1030
- }
1031
- catch (err) {
1032
- const msg = err instanceof Error ? err.message : 'Unknown detection error';
1033
- return {
1034
- stage: 'failed',
1035
- errorCode: 'SCHEMA_VALIDATION_FAILED',
1036
- message: `Could not detect project at '${projectPath}': ${msg}. Ensure it has a package.json, or pass projectPath explicitly.`,
1037
- };
1038
- }
1039
- // Auto-open the editor for the modes the visual-editor attach hooks support —
1040
- // 'vite' (scaffolded apps) and 'static' (empty / HTML-only workspaces, which
1041
- // open in static mode with no dev server). For other frameworks (next, etc.)
1042
- // the agent opens the editor itself via the standalone open_visual_editor
1043
- // tool. workspaceRoot === projectPath for existing-project sessions — there's
1044
- // no subproject nesting, the project is the workspace.
1045
- const editorFramework = framework === 'vite' || framework === 'static' ? framework : undefined;
1046
- const ensureExistingEditorOpen = deps.ensureExistingVisualEditorOpen ?? deps.ensureVisualEditorOpen;
1047
- const visualEditor = ensureExistingEditorOpen && editorFramework
1048
- ? await ensureExistingEditorOpen({
1049
- projectPath,
1050
- workspaceRoot: projectPath,
1051
- framework: editorFramework,
1052
- })
1053
- : undefined;
1054
- // Existing-project source grounding: store any raw userContext as a
1055
- // read-only context bundle and thread it into the code_gen work items. No
1056
- // source_plan stage runs for existing projects (single-call kickoff is
1057
- // preserved) — the agent reads the raw sources directly during code-gen.
1058
- const sessionId = (0, crypto_1.randomUUID)();
1059
- const variantContext = (args.userContext?.length ?? 0) > 0
1060
- ? (0, variantContext_1.createVariantContextBundle)({
1061
- sessionId,
1062
- prompt: args.prompt,
1063
- workspaceRoot: projectPath,
1064
- userContextInputs: args.userContext,
1065
- allowedRoots: [projectPath, cwd()],
1066
- })
1067
- : undefined;
1068
- const result = await deps.orchestrator.startUnified({
1069
- prompt: args.prompt,
1070
- count: args.count,
1071
- target: args.target,
1072
- sessionId,
1073
- projectContext: {
1074
- kind: 'existing',
1075
- projectPath,
1076
- ...(args.designContext ? { designContext: args.designContext } : {}),
1077
- ...(variantContext ? { variantContext } : {}),
1078
- },
1079
- runLabel: args.runLabel,
1080
- leaseOwner: deps.leaseOwner(),
1081
- briefs: args.briefs,
1082
- ...(args.requestId ? { requestId: args.requestId } : {}),
1083
- // Sequential Varys on a live existing-project session accumulate into it
1084
- // rather than superseding it (the inline-element flow opts out).
1085
- allowAccumulate: true,
1086
- ...(args.sourceVariantId ? { sourceVariantId: args.sourceVariantId } : {}),
1087
- });
1088
- const response = assembleStartVariantsResponse({
1089
- mode: 'existing',
1090
- result,
1091
- project: { projectPath, framework },
1092
- visualEditor,
1093
- ...(deps.pendingVariantRequestCount
1094
- ? { pendingVariantRequests: deps.pendingVariantRequestCount() }
1095
- : {}),
1096
- });
1097
- claimStartVariantsRequestLease(args, deps, response);
1098
- return response;
1099
- }
1100
- /**
1101
- * Binds a visual-editor request to variant work only after the agent response
1102
- * includes the work items needed to complete that request.
1103
- */
1104
- function claimStartVariantsRequestLease(args, deps, response) {
1105
- if (!args.requestId || response.stage !== 'work_items_ready')
1106
- return;
1107
- deps.claimVariantRequestLease?.({
1108
- requestId: args.requestId,
1109
- sessionId: response.sessionId,
1110
- workItemIds: response.variants.map((variant) => variant.variantId),
1111
- });
1112
- }
1113
- /**
1114
- * Build the StartVariantsOutput from a startUnified result + the lease
1115
- * info it surfaced. Pairs each variant in the original `variants` list
1116
- * with its `leasedWorkItems[]` entry from requestWork so the agent sees
1117
- * one consistent per-variant object with everything it needs.
1118
- */
1119
- function assembleStartVariantsResponse(args) {
1120
- const { result } = args;
1121
- if (result.leaseId === undefined ||
1122
- result.leaseTtlMs === undefined ||
1123
- result.leasedWorkItems === undefined) {
1124
- return {
1125
- stage: 'failed',
1126
- errorCode: 'INVALID_STAGE_ACTION',
1127
- message: 'start_variants expected startUnified to start the variants but none were returned.',
1128
- };
1129
- }
1130
- const itemById = new Map(result.leasedWorkItems.map((item) => [item.id, item]));
1131
- const variants = [];
1132
- for (const v of result.variants) {
1133
- const workItem = itemById.get(v.variantId);
1134
- if (!workItem) {
1135
- return {
1136
- stage: 'failed',
1137
- errorCode: 'INVALID_STAGE_ACTION',
1138
- message: `start_variants leased fewer items than variants — missing workItem for ${v.variantId}.`,
1139
- };
1140
- }
1141
- variants.push({ ...v, workItem });
1142
- }
1143
- return {
1144
- sessionId: result.sessionId,
1145
- stage: 'work_items_ready',
1146
- mode: args.mode,
1147
- leaseId: result.leaseId,
1148
- leaseTtlMs: result.leaseTtlMs,
1149
- variants,
1150
- scaffoldBaseWorkItemId: result.scaffoldBaseWorkItemId,
1151
- ...(args.destinationPath ? { destinationPath: args.destinationPath } : {}),
1152
- ...(args.visualEditor ? { visualEditor: args.visualEditor } : {}),
1153
- ...(args.visualEditor
1154
- ? {
1155
- editorNextAction: buildVisualEditorWatchAction(args.visualEditor.sessionId, 'after_variant_work_dispatch'),
1156
- }
1157
- : {}),
1158
- ...(args.project ? { project: args.project } : {}),
1159
- ...(args.pendingVariantRequests !== undefined
1160
- ? { pendingVariantRequests: args.pendingVariantRequests }
1161
- : {}),
1162
- nextAction: 'report_work_item',
1163
- };
1164
- }
1165
- //# sourceMappingURL=tools.js.map