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.
- package/README.md +50 -26
- package/README.npm.md +50 -26
- package/bin/rivet.js +39 -24
- package/dist/{mcp/agent-variants → agent-variants}/SessionStore.d.ts +11 -19
- package/dist/agent-variants/SessionStore.d.ts.map +1 -0
- package/dist/{mcp/agent-variants → agent-variants}/SessionStore.js +77 -80
- package/dist/agent-variants/SessionStore.js.map +1 -0
- package/dist/{mcp/agent-variants → agent-variants}/WorktreeOrchestrator.d.ts +53 -21
- package/dist/agent-variants/WorktreeOrchestrator.d.ts.map +1 -0
- package/dist/{mcp/agent-variants → agent-variants}/WorktreeOrchestrator.js +291 -49
- package/dist/agent-variants/WorktreeOrchestrator.js.map +1 -0
- package/dist/{mcp/agent-variants → agent-variants}/WorktreeOrchestrator.testHelpers.d.ts +1 -9
- package/dist/agent-variants/WorktreeOrchestrator.testHelpers.d.ts.map +1 -0
- package/dist/{mcp/agent-variants → agent-variants}/WorktreeOrchestrator.testHelpers.js +3 -18
- package/dist/agent-variants/WorktreeOrchestrator.testHelpers.js.map +1 -0
- package/dist/agent-variants/briefContent.d.ts.map +1 -0
- package/dist/agent-variants/briefContent.js.map +1 -0
- package/dist/{mcp/agent-variants → agent-variants}/contracts.d.ts +715 -721
- package/dist/agent-variants/contracts.d.ts.map +1 -0
- package/dist/{mcp/agent-variants → agent-variants}/contracts.js +2 -3
- package/dist/agent-variants/contracts.js.map +1 -0
- package/dist/agent-variants/createProjectArtifacts.d.ts.map +1 -0
- package/dist/agent-variants/createProjectArtifacts.js.map +1 -0
- package/dist/agent-variants/diffQa.d.ts.map +1 -0
- package/dist/agent-variants/diffQa.js.map +1 -0
- package/dist/{mcp/agent-variants → agent-variants}/elementRefToTarget.d.ts +1 -1
- package/dist/agent-variants/elementRefToTarget.d.ts.map +1 -0
- package/dist/agent-variants/elementRefToTarget.js.map +1 -0
- package/dist/agent-variants/errors.d.ts.map +1 -0
- package/dist/agent-variants/errors.js.map +1 -0
- package/dist/agent-variants/generatedDestination.d.ts +29 -0
- package/dist/agent-variants/generatedDestination.d.ts.map +1 -0
- package/dist/agent-variants/generatedDestination.js +59 -0
- package/dist/agent-variants/generatedDestination.js.map +1 -0
- package/dist/{mcp/agent-variants → agent-variants}/index.d.ts +3 -6
- package/dist/agent-variants/index.d.ts.map +1 -0
- package/dist/{mcp/agent-variants → agent-variants}/index.js +3 -6
- package/dist/agent-variants/index.js.map +1 -0
- package/dist/agent-variants/previewQa.d.ts.map +1 -0
- package/dist/agent-variants/previewQa.js.map +1 -0
- package/dist/agent-variants/runLabel.d.ts.map +1 -0
- package/dist/agent-variants/runLabel.js.map +1 -0
- package/dist/agent-variants/runPlan.d.ts.map +1 -0
- package/dist/agent-variants/runPlan.js.map +1 -0
- package/dist/agent-variants/sourceContext.d.ts.map +1 -0
- package/dist/agent-variants/sourceContext.js.map +1 -0
- package/dist/agent-variants/variantContext.d.ts.map +1 -0
- package/dist/agent-variants/variantContext.js.map +1 -0
- package/dist/cli/client.d.ts +43 -0
- package/dist/cli/client.d.ts.map +1 -0
- package/dist/cli/client.js +109 -0
- package/dist/cli/client.js.map +1 -0
- package/dist/cli/commandNames.d.ts +9 -0
- package/dist/cli/commandNames.d.ts.map +1 -0
- package/dist/cli/commandNames.js +24 -0
- package/dist/cli/commandNames.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +10 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +81 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/elementSelector.d.ts +10 -0
- package/dist/cli/commands/elementSelector.d.ts.map +1 -0
- package/dist/cli/commands/elementSelector.js +41 -0
- package/dist/cli/commands/elementSelector.js.map +1 -0
- package/dist/cli/commands/evidence.d.ts +9 -0
- package/dist/cli/commands/evidence.d.ts.map +1 -0
- package/dist/cli/commands/evidence.js +85 -0
- package/dist/cli/commands/evidence.js.map +1 -0
- package/dist/cli/commands/mcpServe.d.ts +40 -0
- package/dist/cli/commands/mcpServe.d.ts.map +1 -0
- package/dist/cli/commands/mcpServe.js +440 -0
- package/dist/cli/commands/mcpServe.js.map +1 -0
- package/dist/cli/commands/open.d.ts +28 -0
- package/dist/cli/commands/open.d.ts.map +1 -0
- package/dist/cli/commands/open.js +280 -0
- package/dist/cli/commands/open.js.map +1 -0
- package/dist/cli/commands/reference.d.ts +8 -0
- package/dist/cli/commands/reference.d.ts.map +1 -0
- package/dist/cli/commands/reference.js +101 -0
- package/dist/cli/commands/reference.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +9 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +182 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/shared.d.ts +31 -0
- package/dist/cli/commands/shared.d.ts.map +1 -0
- package/dist/cli/commands/shared.js +82 -0
- package/dist/cli/commands/shared.js.map +1 -0
- package/dist/cli/commands/status.d.ts +10 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +61 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +8 -0
- package/dist/cli/commands/stop.d.ts.map +1 -0
- package/dist/cli/commands/stop.js +41 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/commands/variants.d.ts +4 -0
- package/dist/cli/commands/variants.d.ts.map +1 -0
- package/dist/cli/commands/variants.js +374 -0
- package/dist/cli/commands/variants.js.map +1 -0
- package/dist/cli/commands/wait.d.ts +10 -0
- package/dist/cli/commands/wait.d.ts.map +1 -0
- package/dist/cli/commands/wait.js +101 -0
- package/dist/cli/commands/wait.js.map +1 -0
- package/dist/cli/entry.d.ts +12 -0
- package/dist/cli/entry.d.ts.map +1 -0
- package/dist/cli/entry.js +61 -0
- package/dist/cli/entry.js.map +1 -0
- package/dist/cli/envelope.d.ts +60 -0
- package/dist/cli/envelope.d.ts.map +1 -0
- package/dist/cli/envelope.js +57 -0
- package/dist/cli/envelope.js.map +1 -0
- package/dist/cli/flags.d.ts +20 -0
- package/dist/cli/flags.d.ts.map +1 -0
- package/dist/cli/flags.js +72 -0
- package/dist/cli/flags.js.map +1 -0
- package/dist/cli/handoff.d.ts +54 -0
- package/dist/cli/handoff.d.ts.map +1 -0
- package/dist/cli/handoff.js +106 -0
- package/dist/cli/handoff.js.map +1 -0
- package/dist/cli/handoffStore.d.ts +24 -0
- package/dist/cli/handoffStore.d.ts.map +1 -0
- package/dist/cli/handoffStore.js +49 -0
- package/dist/cli/handoffStore.js.map +1 -0
- package/dist/cli/hostWorkNextAction.d.ts +45 -0
- package/dist/cli/hostWorkNextAction.d.ts.map +1 -0
- package/dist/cli/hostWorkNextAction.js +43 -0
- package/dist/cli/hostWorkNextAction.js.map +1 -0
- package/dist/cli/io.d.ts +17 -0
- package/dist/cli/io.d.ts.map +1 -0
- package/dist/cli/io.js +19 -0
- package/dist/cli/io.js.map +1 -0
- package/dist/cli/router.d.ts +23 -0
- package/dist/cli/router.d.ts.map +1 -0
- package/dist/cli/router.js +236 -0
- package/dist/cli/router.js.map +1 -0
- package/dist/cli/runnerSelection.d.ts +60 -0
- package/dist/cli/runnerSelection.d.ts.map +1 -0
- package/dist/cli/runnerSelection.js +93 -0
- package/dist/cli/runnerSelection.js.map +1 -0
- package/dist/cli/serverHandshake.d.ts +51 -0
- package/dist/cli/serverHandshake.d.ts.map +1 -0
- package/dist/cli/serverHandshake.js +144 -0
- package/dist/cli/serverHandshake.js.map +1 -0
- package/dist/index.d.ts +2 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +84 -138
- package/dist/index.js.map +1 -1
- package/dist/install/allowlists.d.ts +65 -0
- package/dist/install/allowlists.d.ts.map +1 -0
- package/dist/install/allowlists.js +333 -0
- package/dist/install/allowlists.js.map +1 -0
- package/dist/install/codexGuidance.d.ts +11 -0
- package/dist/install/codexGuidance.d.ts.map +1 -0
- package/dist/install/codexGuidance.js +90 -0
- package/dist/install/codexGuidance.js.map +1 -0
- package/dist/install/harnesses.d.ts +37 -26
- package/dist/install/harnesses.d.ts.map +1 -1
- package/dist/install/harnesses.js +312 -502
- package/dist/install/harnesses.js.map +1 -1
- package/dist/install/legacyMcp.d.ts +26 -0
- package/dist/install/legacyMcp.d.ts.map +1 -0
- package/dist/install/legacyMcp.js +160 -0
- package/dist/install/legacyMcp.js.map +1 -0
- package/dist/install/mcpRegistration.d.ts +45 -0
- package/dist/install/mcpRegistration.d.ts.map +1 -0
- package/dist/install/mcpRegistration.js +215 -0
- package/dist/install/mcpRegistration.js.map +1 -0
- package/dist/mcp/changeBatchClassification.d.ts +18 -20
- package/dist/mcp/changeBatchClassification.d.ts.map +1 -1
- package/dist/mcp/changeBatchClassification.js +41 -46
- package/dist/mcp/changeBatchClassification.js.map +1 -1
- package/dist/proxy-middleware/proxy-config.d.ts +6 -0
- package/dist/proxy-middleware/proxy-config.d.ts.map +1 -1
- package/dist/proxy-middleware/proxy-config.js +162 -5
- package/dist/proxy-middleware/proxy-config.js.map +1 -1
- package/dist/routes/agentVariants.d.ts +14 -2
- package/dist/routes/agentVariants.d.ts.map +1 -1
- package/dist/routes/agentVariants.js +321 -65
- package/dist/routes/agentVariants.js.map +1 -1
- package/dist/routes/cli.d.ts +31 -0
- package/dist/routes/cli.d.ts.map +1 -0
- package/dist/routes/cli.js +95 -0
- package/dist/routes/cli.js.map +1 -0
- package/dist/routes/git.d.ts +1 -0
- package/dist/routes/git.d.ts.map +1 -1
- package/dist/routes/git.js +2 -1
- package/dist/routes/git.js.map +1 -1
- package/dist/routes/inlineStartTracker.d.ts +23 -0
- package/dist/routes/inlineStartTracker.d.ts.map +1 -0
- package/dist/routes/inlineStartTracker.js +17 -0
- package/dist/routes/inlineStartTracker.js.map +1 -0
- package/dist/routes/mcp.d.ts +2 -12
- package/dist/routes/mcp.d.ts.map +1 -1
- package/dist/routes/mcp.js +4 -785
- package/dist/routes/mcp.js.map +1 -1
- package/dist/server.d.ts +24 -9
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +169 -33
- package/dist/server.js.map +1 -1
- package/dist/services/CommitMessageGenerator.d.ts +9 -1
- package/dist/services/CommitMessageGenerator.d.ts.map +1 -1
- package/dist/services/CommitMessageGenerator.js +4 -1
- package/dist/services/CommitMessageGenerator.js.map +1 -1
- package/dist/services/ComponentSearchService.d.ts +4 -1
- package/dist/services/ComponentSearchService.d.ts.map +1 -1
- package/dist/services/ComponentSearchService.js.map +1 -1
- package/dist/services/ConfigManager.d.ts +8 -0
- package/dist/services/ConfigManager.d.ts.map +1 -1
- package/dist/services/ConfigManager.js +9 -0
- package/dist/services/ConfigManager.js.map +1 -1
- package/dist/services/HistoryReplayService.d.ts +20 -9
- package/dist/services/HistoryReplayService.d.ts.map +1 -1
- package/dist/services/HistoryReplayService.js +99 -43
- package/dist/services/HistoryReplayService.js.map +1 -1
- package/dist/services/MCPVariantsTelemetry.d.ts +1 -1
- package/dist/services/MCPVariantsTelemetry.d.ts.map +1 -1
- package/dist/services/MCPVariantsTelemetry.js +1 -0
- package/dist/services/MCPVariantsTelemetry.js.map +1 -1
- package/dist/services/PRTitleGenerator.d.ts +10 -2
- package/dist/services/PRTitleGenerator.d.ts.map +1 -1
- package/dist/services/PRTitleGenerator.js +8 -2
- package/dist/services/PRTitleGenerator.js.map +1 -1
- package/dist/services/ProjectDetectionService.d.ts.map +1 -1
- package/dist/services/ProjectDetectionService.js +14 -4
- package/dist/services/ProjectDetectionService.js.map +1 -1
- package/dist/services/ProjectMetadataStore.d.ts +115 -0
- package/dist/services/ProjectMetadataStore.d.ts.map +1 -0
- package/dist/services/ProjectMetadataStore.js +336 -0
- package/dist/services/ProjectMetadataStore.js.map +1 -0
- package/dist/services/SessionBridgeService.d.ts +52 -224
- package/dist/services/SessionBridgeService.d.ts.map +1 -1
- package/dist/services/SessionBridgeService.js +97 -649
- package/dist/services/SessionBridgeService.js.map +1 -1
- package/dist/services/SessionService.d.ts +4 -1
- package/dist/services/SessionService.d.ts.map +1 -1
- package/dist/services/SessionService.js +7 -4
- package/dist/services/SessionService.js.map +1 -1
- package/dist/services/StaticFileService.d.ts.map +1 -1
- package/dist/services/StaticFileService.js +6 -0
- package/dist/services/StaticFileService.js.map +1 -1
- package/dist/services/TelemetryService.d.ts +16 -80
- package/dist/services/TelemetryService.d.ts.map +1 -1
- package/dist/services/TelemetryService.js +18 -94
- package/dist/services/TelemetryService.js.map +1 -1
- package/dist/services/VariantGenerationService.d.ts +52 -0
- package/dist/services/VariantGenerationService.d.ts.map +1 -0
- package/dist/services/VariantGenerationService.js +272 -0
- package/dist/services/VariantGenerationService.js.map +1 -0
- package/dist/services/VariantHistoryService.d.ts +37 -1
- package/dist/services/VariantHistoryService.d.ts.map +1 -1
- package/dist/services/VariantHistoryService.js +122 -1
- package/dist/services/VariantHistoryService.js.map +1 -1
- package/dist/services/VariantRunService.d.ts +25 -6
- package/dist/services/VariantRunService.d.ts.map +1 -1
- package/dist/services/VariantRunService.js +98 -4
- package/dist/services/VariantRunService.js.map +1 -1
- package/dist/services/VariantsRuntime.d.ts +1 -3
- package/dist/services/VariantsRuntime.d.ts.map +1 -1
- package/dist/services/VariantsRuntime.js +0 -1
- package/dist/services/VariantsRuntime.js.map +1 -1
- package/dist/services/WorktreeManager.d.ts +1 -1
- package/dist/services/WorktreeManager.d.ts.map +1 -1
- package/dist/services/createAgentVariantsOrchestrator.d.ts +2 -2
- package/dist/services/createAgentVariantsOrchestrator.d.ts.map +1 -1
- package/dist/services/createAgentVariantsOrchestrator.js +2 -3
- package/dist/services/createAgentVariantsOrchestrator.js.map +1 -1
- package/dist/services/projectMetadataMigrations.d.ts +59 -0
- package/dist/services/projectMetadataMigrations.d.ts.map +1 -0
- package/dist/services/projectMetadataMigrations.js +109 -0
- package/dist/services/projectMetadataMigrations.js.map +1 -0
- package/dist/types/change-request-types.d.ts +22 -0
- package/dist/types/change-request-types.d.ts.map +1 -1
- package/dist/utils/logger.d.ts +2 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +3 -7
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/loopback.d.ts +3 -0
- package/dist/utils/loopback.d.ts.map +1 -0
- package/dist/utils/loopback.js +13 -0
- package/dist/utils/loopback.js.map +1 -0
- package/dist/utils/pid.d.ts +3 -0
- package/dist/utils/pid.d.ts.map +1 -0
- package/dist/utils/pid.js +15 -0
- package/dist/utils/pid.js.map +1 -0
- package/dist/utils/queueAccess.d.ts +7 -0
- package/dist/utils/queueAccess.d.ts.map +1 -1
- package/dist/utils/queueAccess.js +8 -1
- package/dist/utils/queueAccess.js.map +1 -1
- package/dist/utils/shouldRecordHostedDemoSessionAction.d.ts +3 -3
- package/dist/utils/shouldRecordHostedDemoSessionAction.d.ts.map +1 -1
- package/dist/utils/shouldRecordHostedDemoSessionAction.js +3 -19
- package/dist/utils/shouldRecordHostedDemoSessionAction.js.map +1 -1
- package/dist/utils/skillWriter.d.ts.map +1 -1
- package/dist/utils/skillWriter.js +12 -11
- package/dist/utils/skillWriter.js.map +1 -1
- package/dist/utils/skills/claude-skill.d.ts +7 -2
- package/dist/utils/skills/claude-skill.d.ts.map +1 -1
- package/dist/utils/skills/claude-skill.js +10 -83
- package/dist/utils/skills/claude-skill.js.map +1 -1
- package/dist/utils/skills/cli-guidance.d.ts +12 -0
- package/dist/utils/skills/cli-guidance.d.ts.map +1 -0
- package/dist/utils/skills/cli-guidance.js +57 -0
- package/dist/utils/skills/cli-guidance.js.map +1 -0
- package/dist/utils/skills/cursor-rules.d.ts +8 -2
- package/dist/utils/skills/cursor-rules.d.ts.map +1 -1
- package/dist/utils/skills/cursor-rules.js +11 -80
- package/dist/utils/skills/cursor-rules.js.map +1 -1
- package/dist/utils/variantSessionStart.d.ts +1 -1
- package/dist/utils/variantSessionStart.d.ts.map +1 -1
- package/dist/utils/variantSessionStart.js +1 -1
- package/dist/utils/variantSessionStart.js.map +1 -1
- package/package.json +4 -4
- package/src/ui/dist/assets/main-BWOvFoal.js +419 -0
- package/src/ui/dist/assets/main-Dyos9I29.css +1 -0
- package/src/ui/dist/index.html +2 -2
- package/dist/mcp/agent-variants/SessionStore.d.ts.map +0 -1
- package/dist/mcp/agent-variants/SessionStore.js.map +0 -1
- package/dist/mcp/agent-variants/WorktreeOrchestrator.d.ts.map +0 -1
- package/dist/mcp/agent-variants/WorktreeOrchestrator.js.map +0 -1
- package/dist/mcp/agent-variants/WorktreeOrchestrator.testHelpers.d.ts.map +0 -1
- package/dist/mcp/agent-variants/WorktreeOrchestrator.testHelpers.js.map +0 -1
- package/dist/mcp/agent-variants/areNaSourceContext.d.ts +0 -20
- package/dist/mcp/agent-variants/areNaSourceContext.d.ts.map +0 -1
- package/dist/mcp/agent-variants/areNaSourceContext.js +0 -118
- package/dist/mcp/agent-variants/areNaSourceContext.js.map +0 -1
- package/dist/mcp/agent-variants/briefContent.d.ts.map +0 -1
- package/dist/mcp/agent-variants/briefContent.js.map +0 -1
- package/dist/mcp/agent-variants/contracts.d.ts.map +0 -1
- package/dist/mcp/agent-variants/contracts.js.map +0 -1
- package/dist/mcp/agent-variants/createProjectArtifacts.d.ts.map +0 -1
- package/dist/mcp/agent-variants/createProjectArtifacts.js.map +0 -1
- package/dist/mcp/agent-variants/createZeroToOneTool.d.ts +0 -63
- package/dist/mcp/agent-variants/createZeroToOneTool.d.ts.map +0 -1
- package/dist/mcp/agent-variants/createZeroToOneTool.js +0 -265
- package/dist/mcp/agent-variants/createZeroToOneTool.js.map +0 -1
- package/dist/mcp/agent-variants/diffQa.d.ts.map +0 -1
- package/dist/mcp/agent-variants/diffQa.js.map +0 -1
- package/dist/mcp/agent-variants/elementRefToTarget.d.ts.map +0 -1
- package/dist/mcp/agent-variants/elementRefToTarget.js.map +0 -1
- package/dist/mcp/agent-variants/errors.d.ts.map +0 -1
- package/dist/mcp/agent-variants/errors.js.map +0 -1
- package/dist/mcp/agent-variants/generatedDestination.d.ts +0 -75
- package/dist/mcp/agent-variants/generatedDestination.d.ts.map +0 -1
- package/dist/mcp/agent-variants/generatedDestination.js +0 -103
- package/dist/mcp/agent-variants/generatedDestination.js.map +0 -1
- package/dist/mcp/agent-variants/index.d.ts.map +0 -1
- package/dist/mcp/agent-variants/index.js.map +0 -1
- package/dist/mcp/agent-variants/pendingChangesAdapter.d.ts +0 -38
- package/dist/mcp/agent-variants/pendingChangesAdapter.d.ts.map +0 -1
- package/dist/mcp/agent-variants/pendingChangesAdapter.js +0 -93
- package/dist/mcp/agent-variants/pendingChangesAdapter.js.map +0 -1
- package/dist/mcp/agent-variants/pinterestSourceContext.d.ts +0 -23
- package/dist/mcp/agent-variants/pinterestSourceContext.d.ts.map +0 -1
- package/dist/mcp/agent-variants/pinterestSourceContext.js +0 -137
- package/dist/mcp/agent-variants/pinterestSourceContext.js.map +0 -1
- package/dist/mcp/agent-variants/previewQa.d.ts.map +0 -1
- package/dist/mcp/agent-variants/previewQa.js.map +0 -1
- package/dist/mcp/agent-variants/runLabel.d.ts.map +0 -1
- package/dist/mcp/agent-variants/runLabel.js.map +0 -1
- package/dist/mcp/agent-variants/runPlan.d.ts.map +0 -1
- package/dist/mcp/agent-variants/runPlan.js.map +0 -1
- package/dist/mcp/agent-variants/sourceContext.d.ts.map +0 -1
- package/dist/mcp/agent-variants/sourceContext.js.map +0 -1
- package/dist/mcp/agent-variants/tools.d.ts +0 -187
- package/dist/mcp/agent-variants/tools.d.ts.map +0 -1
- package/dist/mcp/agent-variants/tools.js +0 -1165
- package/dist/mcp/agent-variants/tools.js.map +0 -1
- package/dist/mcp/agent-variants/variantContext.d.ts.map +0 -1
- package/dist/mcp/agent-variants/variantContext.js.map +0 -1
- package/dist/mcp/auth/httpOAuthProvider.d.ts +0 -103
- package/dist/mcp/auth/httpOAuthProvider.d.ts.map +0 -1
- package/dist/mcp/auth/httpOAuthProvider.js +0 -735
- package/dist/mcp/auth/httpOAuthProvider.js.map +0 -1
- package/dist/mcp/auth/tools.d.ts +0 -39
- package/dist/mcp/auth/tools.d.ts.map +0 -1
- package/dist/mcp/auth/tools.js +0 -304
- package/dist/mcp/auth/tools.js.map +0 -1
- package/dist/mcp/branding.d.ts +0 -4
- package/dist/mcp/branding.d.ts.map +0 -1
- package/dist/mcp/branding.js +0 -8
- package/dist/mcp/branding.js.map +0 -1
- package/dist/mcp/hostedServer.d.ts +0 -27
- package/dist/mcp/hostedServer.d.ts.map +0 -1
- package/dist/mcp/hostedServer.js +0 -71
- package/dist/mcp/hostedServer.js.map +0 -1
- package/dist/mcp/httpServer.d.ts +0 -63
- package/dist/mcp/httpServer.d.ts.map +0 -1
- package/dist/mcp/httpServer.js +0 -602
- package/dist/mcp/httpServer.js.map +0 -1
- package/dist/mcp/instructions.d.ts +0 -25
- package/dist/mcp/instructions.d.ts.map +0 -1
- package/dist/mcp/instructions.js +0 -39
- package/dist/mcp/instructions.js.map +0 -1
- package/dist/mcp/integrations/tools.d.ts +0 -19
- package/dist/mcp/integrations/tools.d.ts.map +0 -1
- package/dist/mcp/integrations/tools.js +0 -101
- package/dist/mcp/integrations/tools.js.map +0 -1
- package/dist/mcp/server.d.ts +0 -214
- package/dist/mcp/server.d.ts.map +0 -1
- package/dist/mcp/server.js +0 -2536
- package/dist/mcp/server.js.map +0 -1
- package/dist/mcp/toolAnalytics.d.ts +0 -26
- package/dist/mcp/toolAnalytics.d.ts.map +0 -1
- package/dist/mcp/toolAnalytics.js +0 -95
- package/dist/mcp/toolAnalytics.js.map +0 -1
- package/dist/mcp/types.d.ts +0 -7
- package/dist/mcp/types.d.ts.map +0 -1
- package/dist/mcp/types.js +0 -3
- package/dist/mcp/types.js.map +0 -1
- package/dist/mcp/watchLoopResumePrompt.d.ts +0 -16
- package/dist/mcp/watchLoopResumePrompt.d.ts.map +0 -1
- package/dist/mcp/watchLoopResumePrompt.js +0 -21
- package/dist/mcp/watchLoopResumePrompt.js.map +0 -1
- package/dist/prompts/agentModPrompts.d.ts +0 -4
- package/dist/prompts/agentModPrompts.d.ts.map +0 -1
- package/dist/prompts/agentModPrompts.js +0 -34
- package/dist/prompts/agentModPrompts.js.map +0 -1
- package/dist/prompts/tokenWriterPrompts.d.ts +0 -4
- package/dist/prompts/tokenWriterPrompts.d.ts.map +0 -1
- package/dist/prompts/tokenWriterPrompts.js +0 -59
- package/dist/prompts/tokenWriterPrompts.js.map +0 -1
- package/dist/routes/comments.d.ts +0 -3
- package/dist/routes/comments.d.ts.map +0 -1
- package/dist/routes/comments.js +0 -113
- package/dist/routes/comments.js.map +0 -1
- package/dist/routes/components.d.ts +0 -7
- package/dist/routes/components.d.ts.map +0 -1
- package/dist/routes/components.js +0 -88
- package/dist/routes/components.js.map +0 -1
- package/dist/routes/controls.d.ts +0 -7
- package/dist/routes/controls.d.ts.map +0 -1
- package/dist/routes/controls.js +0 -50
- package/dist/routes/controls.js.map +0 -1
- package/dist/routes/design.d.ts +0 -2
- package/dist/routes/design.d.ts.map +0 -1
- package/dist/routes/design.js +0 -29
- package/dist/routes/design.js.map +0 -1
- package/dist/routes/modifications.d.ts +0 -10
- package/dist/routes/modifications.d.ts.map +0 -1
- package/dist/routes/modifications.js +0 -394
- package/dist/routes/modifications.js.map +0 -1
- package/dist/routes/tokens.d.ts +0 -2
- package/dist/routes/tokens.d.ts.map +0 -1
- package/dist/routes/tokens.js +0 -115
- package/dist/routes/tokens.js.map +0 -1
- package/dist/services/AgentSessionService.d.ts +0 -91
- package/dist/services/AgentSessionService.d.ts.map +0 -1
- package/dist/services/AgentSessionService.js +0 -282
- package/dist/services/AgentSessionService.js.map +0 -1
- package/dist/services/BridgeBatchPipeline.d.ts +0 -103
- package/dist/services/BridgeBatchPipeline.d.ts.map +0 -1
- package/dist/services/BridgeBatchPipeline.js +0 -295
- package/dist/services/BridgeBatchPipeline.js.map +0 -1
- package/dist/services/BridgeQueueStore.d.ts +0 -28
- package/dist/services/BridgeQueueStore.d.ts.map +0 -1
- package/dist/services/BridgeQueueStore.js +0 -88
- package/dist/services/BridgeQueueStore.js.map +0 -1
- package/dist/services/CSSTokenWriter.d.ts +0 -22
- package/dist/services/CSSTokenWriter.d.ts.map +0 -1
- package/dist/services/CSSTokenWriter.js +0 -116
- package/dist/services/CSSTokenWriter.js.map +0 -1
- package/dist/services/DesignTokenService.d.ts +0 -39
- package/dist/services/DesignTokenService.d.ts.map +0 -1
- package/dist/services/DesignTokenService.js +0 -100
- package/dist/services/DesignTokenService.js.map +0 -1
- package/dist/services/InlineVariantGenerationService.d.ts +0 -51
- package/dist/services/InlineVariantGenerationService.d.ts.map +0 -1
- package/dist/services/InlineVariantGenerationService.js +0 -475
- package/dist/services/InlineVariantGenerationService.js.map +0 -1
- package/dist/services/InterfaceGenerationService.d.ts +0 -12
- package/dist/services/InterfaceGenerationService.d.ts.map +0 -1
- package/dist/services/InterfaceGenerationService.js +0 -256
- package/dist/services/InterfaceGenerationService.js.map +0 -1
- package/dist/services/TailwindConfigWriter.d.ts +0 -24
- package/dist/services/TailwindConfigWriter.d.ts.map +0 -1
- package/dist/services/TailwindConfigWriter.js +0 -105
- package/dist/services/TailwindConfigWriter.js.map +0 -1
- package/dist/services/TerminalAgentRunner.d.ts +0 -65
- package/dist/services/TerminalAgentRunner.d.ts.map +0 -1
- package/dist/services/TerminalAgentRunner.js +0 -511
- package/dist/services/TerminalAgentRunner.js.map +0 -1
- package/dist/services/VisualVariantAgentRunner.d.ts +0 -20
- package/dist/services/VisualVariantAgentRunner.d.ts.map +0 -1
- package/dist/services/VisualVariantAgentRunner.js +0 -66
- package/dist/services/VisualVariantAgentRunner.js.map +0 -1
- package/dist/services/adapters/TailwindCSSTokenAdapter.d.ts +0 -35
- package/dist/services/adapters/TailwindCSSTokenAdapter.d.ts.map +0 -1
- package/dist/services/adapters/TailwindCSSTokenAdapter.js +0 -278
- package/dist/services/adapters/TailwindCSSTokenAdapter.js.map +0 -1
- package/dist/services/agent/AgentCore.d.ts +0 -126
- package/dist/services/agent/AgentCore.d.ts.map +0 -1
- package/dist/services/agent/AgentCore.js +0 -759
- package/dist/services/agent/AgentCore.js.map +0 -1
- package/dist/services/agent/AgentModService.d.ts +0 -98
- package/dist/services/agent/AgentModService.d.ts.map +0 -1
- package/dist/services/agent/AgentModService.js +0 -400
- package/dist/services/agent/AgentModService.js.map +0 -1
- package/dist/services/agent/index.d.ts +0 -2
- package/dist/services/agent/index.d.ts.map +0 -1
- package/dist/services/agent/index.js +0 -6
- package/dist/services/agent/index.js.map +0 -1
- package/dist/types/editor-interface-types.d.ts +0 -67
- package/dist/types/editor-interface-types.d.ts.map +0 -1
- package/dist/types/editor-interface-types.js +0 -12
- package/dist/types/editor-interface-types.js.map +0 -1
- package/dist/utils/elementRefToContext.d.ts +0 -4
- package/dist/utils/elementRefToContext.d.ts.map +0 -1
- package/dist/utils/elementRefToContext.js +0 -63
- package/dist/utils/elementRefToContext.js.map +0 -1
- package/dist/utils/skills/shared-variants-protocol.d.ts +0 -69
- package/dist/utils/skills/shared-variants-protocol.d.ts.map +0 -1
- package/dist/utils/skills/shared-variants-protocol.js +0 -292
- package/dist/utils/skills/shared-variants-protocol.js.map +0 -1
- package/src/ui/dist/assets/main-CLAqO1bm.js +0 -656
- package/src/ui/dist/assets/main-Ke-Q9lWa.css +0 -1
- /package/dist/{mcp/agent-variants → agent-variants}/briefContent.d.ts +0 -0
- /package/dist/{mcp/agent-variants → agent-variants}/briefContent.js +0 -0
- /package/dist/{mcp/agent-variants → agent-variants}/createProjectArtifacts.d.ts +0 -0
- /package/dist/{mcp/agent-variants → agent-variants}/createProjectArtifacts.js +0 -0
- /package/dist/{mcp/agent-variants → agent-variants}/diffQa.d.ts +0 -0
- /package/dist/{mcp/agent-variants → agent-variants}/diffQa.js +0 -0
- /package/dist/{mcp/agent-variants → agent-variants}/elementRefToTarget.js +0 -0
- /package/dist/{mcp/agent-variants → agent-variants}/errors.d.ts +0 -0
- /package/dist/{mcp/agent-variants → agent-variants}/errors.js +0 -0
- /package/dist/{mcp/agent-variants → agent-variants}/previewQa.d.ts +0 -0
- /package/dist/{mcp/agent-variants → agent-variants}/previewQa.js +0 -0
- /package/dist/{mcp/agent-variants → agent-variants}/runLabel.d.ts +0 -0
- /package/dist/{mcp/agent-variants → agent-variants}/runLabel.js +0 -0
- /package/dist/{mcp/agent-variants → agent-variants}/runPlan.d.ts +0 -0
- /package/dist/{mcp/agent-variants → agent-variants}/runPlan.js +0 -0
- /package/dist/{mcp/agent-variants → agent-variants}/sourceContext.d.ts +0 -0
- /package/dist/{mcp/agent-variants → agent-variants}/sourceContext.js +0 -0
- /package/dist/{mcp/agent-variants → agent-variants}/variantContext.d.ts +0 -0
- /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
|