rivet-design 0.25.0 → 0.26.1

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 (69) hide show
  1. package/README.md +2 -2
  2. package/README.npm.md +2 -2
  3. package/dist/agent-variants/PreviewRuntime.d.ts +1 -20
  4. package/dist/agent-variants/PreviewRuntime.js +1 -102
  5. package/dist/agent-variants/SessionStore.d.ts +1 -8
  6. package/dist/agent-variants/SessionStore.js +2 -32
  7. package/dist/agent-variants/WorkspaceInventory.d.ts +0 -3
  8. package/dist/agent-variants/WorkspaceInventory.js +5 -28
  9. package/dist/agent-variants/WorktreeOrchestrator.d.ts +1 -30
  10. package/dist/agent-variants/WorktreeOrchestrator.js +4 -643
  11. package/dist/agent-variants/WorktreeOrchestrator.testHelpers.d.ts +0 -7
  12. package/dist/agent-variants/WorktreeOrchestrator.testHelpers.js +0 -34
  13. package/dist/agent-variants/contracts.d.ts +320 -380
  14. package/dist/agent-variants/contracts.js +1 -8
  15. package/dist/agent-variants/index.d.ts +1 -1
  16. package/dist/agent-variants/runPlan.d.ts +0 -2
  17. package/dist/agent-variants/runPlan.js +0 -3
  18. package/dist/agent-variants/variant-project-runtime.d.ts +0 -2
  19. package/dist/agent-variants/variantWorkspaceFiles.d.ts +0 -3
  20. package/dist/agent-variants/variantWorkspaceFiles.js +1 -59
  21. package/dist/agent-variants/variantsTelemetry.d.ts +0 -8
  22. package/dist/agent-variants/workItemInput.d.ts +210 -210
  23. package/dist/cli/commands/mcpServe.d.ts +2 -2
  24. package/dist/cli/commands/mcpServe.js +1 -0
  25. package/dist/cli/commands/variants.js +2 -43
  26. package/dist/cli/router.js +3 -2
  27. package/dist/config/flags.d.ts +0 -3
  28. package/dist/config/flags.js +0 -1
  29. package/dist/config/pluginMetrics.js +0 -4
  30. package/dist/index.d.ts +1 -1
  31. package/dist/index.js +20 -8
  32. package/dist/install/mcpRegistration.js +1 -0
  33. package/dist/mcp/explorationTools.js +0 -17
  34. package/dist/routes/account.js +4 -2
  35. package/dist/routes/agentVariants.js +1 -89
  36. package/dist/routes/library/browserAccess.d.ts +3 -1
  37. package/dist/routes/library/browserAccess.js +5 -3
  38. package/dist/routes/library/index.js +1 -0
  39. package/dist/routes/variantRequestSchema.d.ts +4 -4
  40. package/dist/services/AuthService.js +2 -2
  41. package/dist/services/ConfigManager.d.ts +18 -1
  42. package/dist/services/ConfigManager.js +91 -4
  43. package/dist/services/GuidanceVerifierRunner.js +13 -2
  44. package/dist/services/SessionBridgeService.d.ts +0 -2
  45. package/dist/services/SessionBridgeService.js +0 -26
  46. package/dist/services/TelemetryService.d.ts +4 -15
  47. package/dist/services/TelemetryService.js +29 -33
  48. package/dist/services/VariantRunService.d.ts +0 -5
  49. package/dist/services/VariantRunService.js +0 -3
  50. package/dist/services/WorktreeManager.d.ts +0 -3
  51. package/dist/services/WorktreeManager.js +7 -54
  52. package/dist/services/createAgentVariantsOrchestrator.js +0 -1
  53. package/dist/services/profiles/DesignProfiles.js +4 -3
  54. package/dist/storage/library/ProjectPreviewCache.d.ts +2 -2
  55. package/dist/types/guidance-verifier.d.ts +458 -59
  56. package/dist/types/guidance-verifier.js +35 -12
  57. package/dist/utils/skills/claude-skill.d.ts +1 -1
  58. package/dist/utils/skills/claude-skill.js +1 -1
  59. package/dist/utils/skills/cli-guidance.d.ts +1 -1
  60. package/dist/utils/skills/cli-guidance.js +7 -9
  61. package/dist/utils/skills/cursor-rules.d.ts +1 -1
  62. package/dist/utils/skills/cursor-rules.js +1 -1
  63. package/package.json +3 -3
  64. package/src/ui/dist/assets/{LibraryEntry-BJl_pPMq.js → LibraryEntry-Cr4GFYXW.js} +9 -9
  65. package/src/ui/dist/assets/main-tPO1OCpZ.js +439 -0
  66. package/src/ui/dist/index.html +1 -1
  67. package/dist/agent-variants/createProjectArtifacts.d.ts +0 -61
  68. package/dist/agent-variants/createProjectArtifacts.js +0 -113
  69. package/src/ui/dist/assets/main-D1832qVC.js +0 -439
@@ -5,12 +5,12 @@ type McpServeOptions = {
5
5
  projectPath?: string;
6
6
  handoffArgs?: string[];
7
7
  noTelemetry?: boolean;
8
- telemetry?: Pick<TelemetryService, 'track' | 'trackCliCommandCompleted' | 'trackMCPToolExecuted' | 'trackMCPToolFailed' | 'shutdown'>;
8
+ telemetry?: Pick<TelemetryService, 'track' | 'trackCliCommandCompleted' | 'trackMCPToolExecuted' | 'trackMCPToolFailed' | 'reportInstallRefActivations' | 'shutdown'>;
9
9
  };
10
10
  export declare const isStaleAttachError: (envelope: CliEnvelope) => boolean;
11
11
  export declare const buildMcpServer: (options?: McpServeOptions) => Promise<{
12
12
  mcp: import("@modelcontextprotocol/sdk/server/mcp.js").McpServer;
13
- telemetry: Pick<TelemetryService, "track" | "trackCliCommandCompleted" | "trackMCPToolExecuted" | "trackMCPToolFailed" | "shutdown"> | null;
13
+ telemetry: Pick<TelemetryService, "reportInstallRefActivations" | "track" | "trackCliCommandCompleted" | "trackMCPToolExecuted" | "trackMCPToolFailed" | "shutdown"> | null;
14
14
  }>;
15
15
  export declare const handleMcpServe: (rest: string[], io: CliIO) => Promise<CliCommandResult>;
16
16
  export {};
@@ -238,6 +238,7 @@ const buildMcpServer = async (options = {}) => {
238
238
  isRecoverable: args.envelope.error.isRecoverable,
239
239
  });
240
240
  }
241
+ telemetry?.reportInstallRefActivations();
241
242
  }
242
243
  catch { }
243
244
  return toToolResult(args.envelope, args.progress);
@@ -58,7 +58,6 @@ const errorMessage_1 = require("../../utils/errorMessage");
58
58
  const START_COMMAND = 'variants.start';
59
59
  const STATUS_COMMAND = 'variants.status';
60
60
  const CANCEL_COMMAND = 'variants.cancel';
61
- const COMMIT_COMMAND = 'variants.commit';
62
61
  const COMPLETE_COMMAND = 'variants.complete';
63
62
  const GET_COMMAND = 'variants.get';
64
63
  const LIST_COMMAND = 'variants.list';
@@ -102,9 +101,6 @@ const CONTEXT_IMAGE_MIME_BY_EXTENSION = new Map([
102
101
  const MAX_REFERENCE_PAGES = 3;
103
102
  const MAX_REFERENCE_VIDEOS = 2;
104
103
  const REFERENCE_VIDEO_EXTENSIONS = new Set(['.mp4', '.mov', '.webm', '.m4v']);
105
- const COMMIT_FLAG_SPEC = {
106
- session: { takesValue: true },
107
- };
108
104
  const COMPLETE_FLAG_SPEC = {
109
105
  session: { takesValue: true },
110
106
  status: { takesValue: true },
@@ -698,44 +694,10 @@ const handleVariantsCancel = async (args) => {
698
694
  };
699
695
  const resolveActiveSessionId = async (attached) => {
700
696
  const response = await (0, client_1.requestServer)(attached, '/api/variants/active');
701
- if (response.status !== 200 || response.body.active !== true) {
697
+ if (response.status !== 200 || response.body.active !== true)
702
698
  return null;
703
- }
704
699
  return response.body.sessionId ?? null;
705
700
  };
706
- const handleVariantsCommit = async (args) => {
707
- const context = (0, shared_1.parseCommandContext)(COMMIT_COMMAND, args, COMMIT_FLAG_SPEC);
708
- if ((0, shared_1.isCommandResult)(context)) {
709
- return context;
710
- }
711
- const variantId = context.flags.positionals[0];
712
- if (!variantId) {
713
- return (0, envelope_1.errorResult)(COMMIT_COMMAND, 'USAGE_ERROR', 'Usage: rivet variants commit <variantId> [--session <sessionId>]');
714
- }
715
- const attached = await (0, shared_1.attachOrUnavailable)(COMMIT_COMMAND, context.projectPath);
716
- if (!(0, shared_1.isAttached)(attached)) {
717
- return attached;
718
- }
719
- try {
720
- const sessionId = (0, flags_1.stringFlag)(context.flags, 'session') ??
721
- (await resolveActiveSessionId(attached));
722
- if (!sessionId) {
723
- return (0, envelope_1.errorResult)(COMMIT_COMMAND, 'OPERATION_FAILED', 'No active variants session. Pass --session <sessionId> for a past session.');
724
- }
725
- const response = await (0, client_1.requestServer)(attached, `/api/variants/${encodeURIComponent(sessionId)}/commit`, { method: 'POST', body: { variantId } });
726
- if (response.status !== 200) {
727
- return (0, shared_1.serverErrorResult)(COMMIT_COMMAND, response.status, response.body);
728
- }
729
- return (0, envelope_1.okResult)(COMMIT_COMMAND, {
730
- sessionId,
731
- variantId,
732
- result: response.body,
733
- });
734
- }
735
- catch (error) {
736
- return (0, shared_1.transportErrorResult)(COMMIT_COMMAND, error);
737
- }
738
- };
739
701
  const handleVariantsComplete = async (args) => {
740
702
  const context = (0, shared_1.parseCommandContext)(COMPLETE_COMMAND, args, COMPLETE_FLAG_SPEC);
741
703
  if ((0, shared_1.isCommandResult)(context)) {
@@ -939,9 +901,6 @@ const handleVariants = async (args, options = {}) => {
939
901
  if (action === 'cancel') {
940
902
  return handleVariantsCancel(rest);
941
903
  }
942
- if (action === 'commit') {
943
- return handleVariantsCommit(rest);
944
- }
945
904
  if (action === 'complete') {
946
905
  return handleVariantsComplete(rest);
947
906
  }
@@ -951,7 +910,7 @@ const handleVariants = async (args, options = {}) => {
951
910
  if (action === 'list') {
952
911
  return handleVariantsList(rest);
953
912
  }
954
- return (0, envelope_1.errorResult)('variants', 'USAGE_ERROR', 'Usage: rivet variants <start|status|cancel|commit|complete|get|list> [options]');
913
+ return (0, envelope_1.errorResult)('variants', 'USAGE_ERROR', 'Usage: rivet variants <start|status|cancel|complete|get|list> [options]');
955
914
  };
956
915
  exports.handleVariants = handleVariants;
957
916
  //# sourceMappingURL=variants.js.map
@@ -79,8 +79,8 @@ const COMMAND_USAGE = {
79
79
  'Block until a work id settles; exits 5 on timeout.',
80
80
  ],
81
81
  variants: [
82
- 'rivet variants <start|status|cancel|commit|complete|get|list> [options]',
83
- 'start: --instruction <text> [--count N] [--element <selector>] [--fresh] [--target <sessionId>:<variantId>] [--worker-provider claude|codex|cursor] [--worker-model <id>] · get <projectId>/<sessionId>:<variantId> [--detail] · cancel <sessionId> · commit <variantId> [--session <id>] · list [--history]',
82
+ 'rivet variants <start|status|cancel|complete|get|list> [options]',
83
+ 'start: --instruction <text> [--count N] [--element <selector>] [--fresh] [--target <sessionId>:<variantId>] [--worker-provider claude|codex|cursor] [--worker-model <id>] · get <projectId>/<sessionId>:<variantId> [--detail] · cancel <sessionId> · list [--history]',
84
84
  ],
85
85
  evidence: [
86
86
  'rivet evidence capture --url <url> [--screenshot] [--width N --height N]',
@@ -311,6 +311,7 @@ const runCliControlCommand = async (args, io = io_1.processCliIO) => {
311
311
  ...(0, telemetry_1.browserMetadataForEnvelope)(result.envelope),
312
312
  ...(0, handoff_1.callerTelemetryFieldsFromArgs)(rest),
313
313
  });
314
+ telemetry.reportInstallRefActivations();
314
315
  await telemetry.shutdown(result.envelope.command === 'variants.get'
315
316
  ? VARIANT_LOOKUP_TELEMETRY_TIMEOUT_MS
316
317
  : undefined);
@@ -26,9 +26,6 @@ export declare const FLAG_DEFINITIONS: {
26
26
  readonly canvasShare: {
27
27
  readonly default: false;
28
28
  };
29
- readonly variantSend: {
30
- readonly default: false;
31
- };
32
29
  readonly generativeControls: {
33
30
  readonly default: false;
34
31
  };
@@ -11,7 +11,6 @@ exports.FLAG_DEFINITIONS = {
11
11
  share: { default: false },
12
12
  deployPrototype: { default: false },
13
13
  canvasShare: { default: false },
14
- variantSend: { default: false },
15
14
  generativeControls: { default: false },
16
15
  refineMode: { default: false },
17
16
  inspectorUndoRedo: { default: false },
@@ -16,7 +16,6 @@ const metricProperties = zod_1.z.object({
16
16
  'variants.get',
17
17
  'variants.list',
18
18
  'variants.complete',
19
- 'variants.commit',
20
19
  'variants.cancel',
21
20
  'reference.fetch',
22
21
  'evidence.capture',
@@ -27,7 +26,6 @@ const metricProperties = zod_1.z.object({
27
26
  'rivet_login',
28
27
  'rivet_explore_designs',
29
28
  'rivet_get_exploration',
30
- 'rivet_apply_design',
31
29
  'rivet_cancel_exploration',
32
30
  'rivet_complete_variant_work',
33
31
  'rivet_get_design_context',
@@ -216,8 +214,6 @@ const PRODUCT_EVENTS = new Set([
216
214
  'agent_variants.preview_started',
217
215
  'agent_variants.preview_ready',
218
216
  'agent_variants.preview_failed',
219
- 'agent_variants.committed',
220
- 'agent_variants.commit_failed',
221
217
  ]);
222
218
  const pluginMetricProperties = (event, properties) => {
223
219
  if (!PRODUCT_EVENTS.has(event))
package/dist/index.d.ts CHANGED
@@ -73,7 +73,7 @@ export declare const authCommandOptionsForArgs: (args: string[]) => {
73
73
  noBrowser: boolean;
74
74
  noTelemetry: boolean;
75
75
  };
76
- export declare const rememberInstallRef: (args: string[]) => string[];
76
+ export declare const rememberInstallRef: (args: string[], downloadType?: string) => string[];
77
77
  export declare const authFailureReasonForError: (error: string | undefined) => "oauth_failed" | "timeout";
78
78
  export declare const main: (args?: string[]) => Promise<void>;
79
79
  export declare const parseArgs: (args: string[]) => CLIOptions;
package/dist/index.js CHANGED
@@ -238,14 +238,19 @@ const authCommandOptionsForArgs = (args) => ({
238
238
  noTelemetry: args.includes('--no-telemetry'),
239
239
  });
240
240
  exports.authCommandOptionsForArgs = authCommandOptionsForArgs;
241
- const rememberInstallRef = (args) => {
241
+ const rememberInstallRef = (args, downloadType) => {
242
242
  const { installRef, remainingArgs } = (0, installRef_1.extractInstallRef)(args);
243
243
  if (installRef) {
244
- (0, ConfigManager_1.getConfigManager)().setInstallRef(installRef);
244
+ (0, ConfigManager_1.getConfigManager)().setInstallRef(installRef, downloadType);
245
245
  }
246
246
  return remainingArgs;
247
247
  };
248
248
  exports.rememberInstallRef = rememberInstallRef;
249
+ const reportInstallRefActivations = async () => {
250
+ const telemetry = new TelemetryService_1.TelemetryService({ source: 'cli' });
251
+ telemetry.reportInstallRefActivations();
252
+ await telemetry.shutdown();
253
+ };
249
254
  const discardInstallRefForValidatedSession = () => {
250
255
  const configManager = (0, ConfigManager_1.getConfigManager)();
251
256
  const installRef = configManager.getInstallRef();
@@ -803,7 +808,8 @@ const promptPostInstall = async () => {
803
808
  }
804
809
  };
805
810
  const handleInstall = async (installArgs) => {
806
- const parsed = (0, flags_1.parseFlags)((0, installRef_1.extractInstallRef)(installArgs).remainingArgs, {
811
+ const { installRef, remainingArgs } = (0, installRef_1.extractInstallRef)(installArgs);
812
+ const parsed = (0, flags_1.parseFlags)(remainingArgs, {
807
813
  mcp: { takesValue: false },
808
814
  'no-mcp': { takesValue: false },
809
815
  'no-telemetry': { takesValue: false },
@@ -852,7 +858,9 @@ const handleInstall = async (installArgs) => {
852
858
  (0, harnesses_1.reportInstallConfirmation)(selection, installArgs);
853
859
  return;
854
860
  }
855
- (0, exports.rememberInstallRef)(installArgs);
861
+ (0, exports.rememberInstallRef)(installArgs, selection.targetIds.join(','));
862
+ if (installRef)
863
+ await reportInstallRefActivations();
856
864
  const bootstrap = (0, globalBootstrap_1.bootstrapGlobalInstall)(installArgs);
857
865
  if (bootstrap.action === 'reexeced') {
858
866
  process.exit(bootstrap.exitCode);
@@ -877,6 +885,10 @@ const handleLogin = async (options = {}) => {
877
885
  enabled: !options.noTelemetry,
878
886
  source: 'cli',
879
887
  });
888
+ const finishTelemetry = async () => {
889
+ telemetry.reportInstallRefActivations();
890
+ await telemetry.shutdown();
891
+ };
880
892
  let authAttemptId = '';
881
893
  let authStartedAt = 0;
882
894
  const startAuthAttempt = () => {
@@ -906,7 +918,7 @@ const handleLogin = async (options = {}) => {
906
918
  outcome: 'already_authenticated',
907
919
  durationMs: Date.now() - authStartedAt,
908
920
  });
909
- await telemetry.shutdown();
921
+ await finishTelemetry();
910
922
  console.log(`✅ Already signed in as ${configManager.getEmail()}`);
911
923
  console.log(`\n${nextStepHint}`);
912
924
  return;
@@ -934,7 +946,7 @@ const handleLogin = async (options = {}) => {
934
946
  outcome: 'authenticated',
935
947
  durationMs: Date.now() - authStartedAt,
936
948
  });
937
- await telemetry.shutdown();
949
+ await finishTelemetry();
938
950
  console.log(`✅ Logged in as ${resumed.user.email}`);
939
951
  console.log(`\n${nextStepHint}`);
940
952
  return;
@@ -983,7 +995,7 @@ const handleLogin = async (options = {}) => {
983
995
  outcome: 'authenticated',
984
996
  durationMs: Date.now() - authStartedAt,
985
997
  });
986
- await telemetry.shutdown();
998
+ await finishTelemetry();
987
999
  console.log(`✅ Logged in as ${loginResult.user?.email}`);
988
1000
  console.log(`\n${nextStepHint}`);
989
1001
  return;
@@ -996,7 +1008,7 @@ const handleLogin = async (options = {}) => {
996
1008
  failureReason: (0, exports.authFailureReasonForError)(loginResult.error),
997
1009
  durationMs: Date.now() - authStartedAt,
998
1010
  });
999
- await telemetry.shutdown();
1011
+ await finishTelemetry();
1000
1012
  console.log(`❌ Login failed: ${loginResult.error || loginResult.message}`);
1001
1013
  if (options.exitOnFailure ?? true) {
1002
1014
  process.exit(1);
@@ -88,6 +88,7 @@ const verifyMcpServeInvocation = (spawnSync = childProcess.spawnSync) => {
88
88
  env: {
89
89
  ...(0, subprocessEnvironment_1.subprocessEnvironment)('rivetRuntime'),
90
90
  RIVET_LOG_LEVEL: 'SILENT',
91
+ RIVET_AUTO_UPDATE_DISABLED: '1',
91
92
  },
92
93
  input: `${input}\n`,
93
94
  timeout: MCP_SERVE_VERIFICATION_TIMEOUT_MS,
@@ -56,23 +56,6 @@ const registerExplorationTools = (dependencies) => {
56
56
  callerAgent: dependencies.callerAgent,
57
57
  callerModel: (0, callerModel_1.callerModelArgsFromToolMeta)(extra._meta)[1],
58
58
  }));
59
- (0, intentTool_1.registerIntentTool)(dependencies, {
60
- name: 'rivet_apply_design',
61
- title: 'Apply chosen design',
62
- description: 'Apply the explicitly selected direction to the project working tree. Writes or replaces project files; generated applications may install dependencies and start a dev server, executing local code and contacting package registries. Only use after the user selects this result. Does not generate a different design.',
63
- shape: {
64
- project: intentTool_1.requiredText,
65
- sessionId: intentTool_1.requiredText,
66
- variantId: intentTool_1.requiredText,
67
- },
68
- annotations: intentTool_1.externalChange,
69
- }, async (input) => runCommand('variants', [
70
- 'commit',
71
- input.variantId,
72
- '--session',
73
- input.sessionId,
74
- ...projectArgs(input.project),
75
- ]));
76
59
  (0, intentTool_1.registerIntentTool)(dependencies, {
77
60
  name: 'rivet_cancel_exploration',
78
61
  title: 'Cancel exploration',
@@ -27,8 +27,9 @@ const createAccountRouter = (telemetry) => {
27
27
  const config = (0, ConfigManager_1.getConfigManager)();
28
28
  config.setAuth(token, email, refreshToken, userId);
29
29
  const carriedInstallRef = (0, installRef_1.parseInstallRef)(installRef);
30
- if (carriedInstallRef)
31
- config.clearInstallRef(carriedInstallRef);
30
+ if (carriedInstallRef) {
31
+ config.completeInstallRefSignIn(carriedInstallRef, config.getUserId());
32
+ }
32
33
  }
33
34
  catch {
34
35
  return res
@@ -36,6 +37,7 @@ const createAccountRouter = (telemetry) => {
36
37
  .json({ error: 'Failed to store auth credentials' });
37
38
  }
38
39
  telemetry?.identifyUser();
40
+ telemetry?.reportInstallRefActivations();
39
41
  log.info(`Stored auth for ${email} via browser OAuth`);
40
42
  res.json({ success: true });
41
43
  });
@@ -48,9 +48,6 @@ const previewPortBody = v3_1.z.object({
48
48
  variantId: v3_1.z.string().min(1).nullable(),
49
49
  retry: v3_1.z.boolean().optional(),
50
50
  });
51
- const commitBody = v3_1.z.object({
52
- variantId: v3_1.z.string().min(1),
53
- });
54
51
  const adoptPastBody = v3_1.z.object({
55
52
  pastSessionId: v3_1.z.string().min(1),
56
53
  pastVariantId: v3_1.z.string().min(1),
@@ -1679,92 +1676,6 @@ const createAgentVariantsRouter = (orchestrator, bridge, telemetry, variantHisto
1679
1676
  sendError(res, err);
1680
1677
  }
1681
1678
  });
1682
- postOperation('/variants/:sessionId/commit', async (req, res) => {
1683
- if (rejectNonLocalRequest(req, res))
1684
- return;
1685
- const sessionId = req.params.sessionId;
1686
- const flags = await (0, evaluateFlags_1.getFeatureFlags)({
1687
- userKey: (0, featureFlagUserKey_1.getConfigFeatureFlagUserKey)({ headers: req.headers }),
1688
- });
1689
- if (!flags.variantSend.isEnabled) {
1690
- res.status(403).json({
1691
- errorCode: 'FEATURE_DISABLED',
1692
- message: 'Variant send is not enabled.',
1693
- });
1694
- return;
1695
- }
1696
- const parsed = commitBody.safeParse(req.body);
1697
- if (!parsed.success) {
1698
- res.status(400).json({
1699
- errorCode: 'SCHEMA_VALIDATION_FAILED',
1700
- message: parsed.error.message,
1701
- });
1702
- return;
1703
- }
1704
- try {
1705
- const projectContext = orchestrator.getProjectContext(sessionId);
1706
- const isFresh = projectContext.kind === 'fresh';
1707
- const result = await orchestrator.commitVariant({
1708
- sessionId,
1709
- variantId: parsed.data.variantId,
1710
- skipTeardown: isFresh,
1711
- });
1712
- if (result.enqueued &&
1713
- result.payloadKind === 'project-created' &&
1714
- isFresh) {
1715
- if (!bridge || !result.destinationPath) {
1716
- variantsTelemetry?.trackAgentVariantsActiveProjectTransition({
1717
- sessionId,
1718
- success: false,
1719
- reasonCode: 'bridge_unavailable',
1720
- destinationPath: result.destinationPath ?? null,
1721
- });
1722
- res.status(503).json({
1723
- errorCode: 'RUNTIME_VALIDATION_FAILED',
1724
- message: 'Variant sent, but active-project transition is unavailable. Keep this session open and run open_visual_editor on the destination project.',
1725
- destinationPath: result.destinationPath ?? null,
1726
- });
1727
- return;
1728
- }
1729
- try {
1730
- bridge.rebindProjectPath(result.destinationPath);
1731
- await orchestrator.cleanupCommittedSession(sessionId);
1732
- variantsTelemetry?.trackAgentVariantsActiveProjectTransition({
1733
- sessionId,
1734
- success: true,
1735
- reasonCode: 'rebind_succeeded',
1736
- destinationPath: result.destinationPath,
1737
- });
1738
- }
1739
- catch {
1740
- variantsTelemetry?.trackAgentVariantsActiveProjectTransition({
1741
- sessionId,
1742
- success: false,
1743
- reasonCode: 'rebind_failed',
1744
- destinationPath: result.destinationPath,
1745
- });
1746
- res.status(500).json({
1747
- errorCode: 'RUNTIME_VALIDATION_FAILED',
1748
- message: 'Variant sent, but active-project handoff failed. Destination project is preserved; keep this variants session open and retry send.',
1749
- destinationPath: result.destinationPath,
1750
- });
1751
- return;
1752
- }
1753
- }
1754
- else if (bridge && result.enqueued) {
1755
- try {
1756
- bridge.switchPreviewPort(null);
1757
- }
1758
- catch (err) {
1759
- log.warn('switchPreviewPort(null) after commit failed', err);
1760
- }
1761
- }
1762
- res.json(result);
1763
- }
1764
- catch (err) {
1765
- sendError(res, err);
1766
- }
1767
- });
1768
1679
  postOperation('/variants/:sessionId/deploy', async (req, res) => {
1769
1680
  if (rejectNonLocalRequest(req, res))
1770
1681
  return;
@@ -2138,6 +2049,7 @@ const createAgentVariantsRouter = (orchestrator, bridge, telemetry, variantHisto
2138
2049
  sendError(res, err);
2139
2050
  }
2140
2051
  });
2052
+ router.use('/variants', (_req, res) => res.sendStatus(404));
2141
2053
  return router;
2142
2054
  };
2143
2055
  exports.createAgentVariantsRouter = createAgentVariantsRouter;
@@ -1,7 +1,9 @@
1
1
  import { Router } from 'express';
2
2
  import { BrowserSessions } from '../../library/BrowserSessions';
3
- export declare const createBrowserAccessRouter: ({ token, sessions, }: {
3
+ import type { TelemetryService } from '../../services/TelemetryService';
4
+ export declare const createBrowserAccessRouter: ({ token, sessions, telemetry, }: {
4
5
  token: string;
5
6
  sessions: BrowserSessions;
7
+ telemetry?: Pick<TelemetryService, "reportInstallRefActivations">;
6
8
  }) => Router;
7
9
  //# sourceMappingURL=browserAccess.d.ts.map
@@ -14,7 +14,7 @@ const signInBody = zod_1.z.object({
14
14
  refreshToken: zod_1.z.string().optional(),
15
15
  installRef: zod_1.z.string().optional(),
16
16
  });
17
- const createBrowserAccessRouter = ({ token, sessions, }) => {
17
+ const createBrowserAccessRouter = ({ token, sessions, telemetry, }) => {
18
18
  const router = (0, express_1.Router)();
19
19
  router.post('/browser-sessions', (0, express_1.json)({ limit: '8kb' }), async (req, res) => {
20
20
  if (!(0, middleware_1.isLocalBrowserRequest)(req))
@@ -39,8 +39,10 @@ const createBrowserAccessRouter = ({ token, sessions, }) => {
39
39
  userId: profile.userId,
40
40
  });
41
41
  const carriedInstallRef = (0, installRef_1.parseInstallRef)(parsed.data.installRef);
42
- if (carriedInstallRef)
43
- sessions.config.clearInstallRef(carriedInstallRef);
42
+ if (carriedInstallRef) {
43
+ sessions.config.completeInstallRefSignIn(carriedInstallRef, profile.userId);
44
+ }
45
+ telemetry?.reportInstallRefActivations();
44
46
  return res.json({ token: browserToken });
45
47
  });
46
48
  router.post('/browser-sessions/exchange', (0, express_1.json)({ limit: '8kb' }), (req, res) => {
@@ -38,6 +38,7 @@ const createLibraryRouter = (options) => {
38
38
  router.use((0, browserAccess_1.createBrowserAccessRouter)({
39
39
  token: options.token,
40
40
  sessions: options.browserSessions,
41
+ telemetry: options.telemetry,
41
42
  }));
42
43
  router.get('/health', (0, middleware_1.authenticateLibrary)(options.token), (_req, res) => res.json({
43
44
  pid: process.pid,
@@ -103,7 +103,7 @@ export declare const inlineVariantRequestSchema: z.ZodEffects<z.ZodObject<{
103
103
  label?: string | undefined;
104
104
  }[] | undefined;
105
105
  runLabel?: string | undefined;
106
- fidelity?: "low" | "medium" | "high" | undefined;
106
+ fidelity?: "high" | "medium" | "low" | undefined;
107
107
  profile?: "off" | "auto" | undefined;
108
108
  briefs?: {
109
109
  label: string;
@@ -131,7 +131,7 @@ export declare const inlineVariantRequestSchema: z.ZodEffects<z.ZodObject<{
131
131
  label?: string | undefined;
132
132
  }[] | undefined;
133
133
  runLabel?: string | undefined;
134
- fidelity?: "low" | "medium" | "high" | undefined;
134
+ fidelity?: "high" | "medium" | "low" | undefined;
135
135
  profile?: "off" | "auto" | undefined;
136
136
  briefs?: {
137
137
  label: string;
@@ -156,7 +156,7 @@ export declare const inlineVariantRequestSchema: z.ZodEffects<z.ZodObject<{
156
156
  label?: string | undefined;
157
157
  }[] | undefined;
158
158
  runLabel?: string | undefined;
159
- fidelity?: "low" | "medium" | "high" | undefined;
159
+ fidelity?: "high" | "medium" | "low" | undefined;
160
160
  profile?: "off" | "auto" | undefined;
161
161
  briefs?: {
162
162
  label: string;
@@ -184,7 +184,7 @@ export declare const inlineVariantRequestSchema: z.ZodEffects<z.ZodObject<{
184
184
  label?: string | undefined;
185
185
  }[] | undefined;
186
186
  runLabel?: string | undefined;
187
- fidelity?: "low" | "medium" | "high" | undefined;
187
+ fidelity?: "high" | "medium" | "low" | undefined;
188
188
  profile?: "off" | "auto" | undefined;
189
189
  briefs?: {
190
190
  label: string;
@@ -403,7 +403,7 @@ class AuthService {
403
403
  if (tokenResult.success && tokenResult.token && tokenResult.user) {
404
404
  this.configManager.setAuth(tokenResult.token, tokenResult.user.email, tokenResult.refreshToken, tokenResult.user.id, { expectedGeneration, isRecovery: true });
405
405
  if (installRef) {
406
- this.configManager.clearInstallRef(installRef);
406
+ this.configManager.completeInstallRefSignIn(installRef, tokenResult.user.id);
407
407
  }
408
408
  log.info(`Logged in as ${tokenResult.user.email}`);
409
409
  }
@@ -530,7 +530,7 @@ class AuthService {
530
530
  (0, pendingLogin_1.clearPendingLogin)();
531
531
  this.configManager.setAuth(tokenResult.token, tokenResult.user.email, tokenResult.refreshToken, tokenResult.user.id, { expectedGeneration: pending.generation, isRecovery: true });
532
532
  if (pending.installRef) {
533
- this.configManager.clearInstallRef(pending.installRef);
533
+ this.configManager.completeInstallRefSignIn(pending.installRef, tokenResult.user.id);
534
534
  }
535
535
  log.info(`Logged in as ${tokenResult.user.email} (resumed login)`);
536
536
  return tokenResult;
@@ -3,6 +3,20 @@ export interface AccountIdentity {
3
3
  userId?: string;
4
4
  email?: string;
5
5
  }
6
+ export type InstallRefActivationTrigger = 'first_run' | 'sign_in';
7
+ export type InstallRefActivation = {
8
+ installRef: string;
9
+ trigger: InstallRefActivationTrigger;
10
+ downloadType?: string;
11
+ userId?: string;
12
+ };
13
+ type InstallRefActivationRecord = {
14
+ installRef: string;
15
+ downloadType?: string;
16
+ signInUserId?: string;
17
+ pendingTriggers: InstallRefActivationTrigger[];
18
+ reportedTriggers: InstallRefActivationTrigger[];
19
+ };
6
20
  type RivetConfig = {
7
21
  authToken?: string;
8
22
  refreshToken?: string;
@@ -21,6 +35,7 @@ type RivetConfig = {
21
35
  workerVendorFallback?: boolean;
22
36
  workerModels?: Partial<Record<'claude' | 'codex' | 'cursor', string>>;
23
37
  installRef?: string;
38
+ installRefActivations?: InstallRefActivationRecord[];
24
39
  };
25
40
  interface ConfigManagerOptions {
26
41
  configPath?: string;
@@ -65,8 +80,10 @@ export declare class ConfigManager {
65
80
  markFirstVariantsRun(): void;
66
81
  claimMcpRemovedTelemetryWindow(now?: Date): boolean;
67
82
  getInstallRef(): string | undefined;
68
- setInstallRef(installRef: string): void;
83
+ setInstallRef(installRef: string, downloadType?: string): void;
69
84
  clearInstallRef(installRef: string): void;
85
+ completeInstallRefSignIn(installRef: string, userId: string | undefined): void;
86
+ claimInstallRefActivations(): InstallRefActivation[];
70
87
  getProxyUrl(): string;
71
88
  getConfiguredRunner(): string | undefined;
72
89
  getConfiguredRunnerPaths(): Record<string, unknown> | undefined;