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.
- package/README.md +2 -2
- package/README.npm.md +2 -2
- package/dist/agent-variants/PreviewRuntime.d.ts +1 -20
- package/dist/agent-variants/PreviewRuntime.js +1 -102
- package/dist/agent-variants/SessionStore.d.ts +1 -8
- package/dist/agent-variants/SessionStore.js +2 -32
- package/dist/agent-variants/WorkspaceInventory.d.ts +0 -3
- package/dist/agent-variants/WorkspaceInventory.js +5 -28
- package/dist/agent-variants/WorktreeOrchestrator.d.ts +1 -30
- package/dist/agent-variants/WorktreeOrchestrator.js +4 -643
- package/dist/agent-variants/WorktreeOrchestrator.testHelpers.d.ts +0 -7
- package/dist/agent-variants/WorktreeOrchestrator.testHelpers.js +0 -34
- package/dist/agent-variants/contracts.d.ts +320 -380
- package/dist/agent-variants/contracts.js +1 -8
- package/dist/agent-variants/index.d.ts +1 -1
- package/dist/agent-variants/runPlan.d.ts +0 -2
- package/dist/agent-variants/runPlan.js +0 -3
- package/dist/agent-variants/variant-project-runtime.d.ts +0 -2
- package/dist/agent-variants/variantWorkspaceFiles.d.ts +0 -3
- package/dist/agent-variants/variantWorkspaceFiles.js +1 -59
- package/dist/agent-variants/variantsTelemetry.d.ts +0 -8
- package/dist/agent-variants/workItemInput.d.ts +210 -210
- package/dist/cli/commands/mcpServe.d.ts +2 -2
- package/dist/cli/commands/mcpServe.js +1 -0
- package/dist/cli/commands/variants.js +2 -43
- package/dist/cli/router.js +3 -2
- package/dist/config/flags.d.ts +0 -3
- package/dist/config/flags.js +0 -1
- package/dist/config/pluginMetrics.js +0 -4
- package/dist/index.d.ts +1 -1
- package/dist/index.js +20 -8
- package/dist/install/mcpRegistration.js +1 -0
- package/dist/mcp/explorationTools.js +0 -17
- package/dist/routes/account.js +4 -2
- package/dist/routes/agentVariants.js +1 -89
- package/dist/routes/library/browserAccess.d.ts +3 -1
- package/dist/routes/library/browserAccess.js +5 -3
- package/dist/routes/library/index.js +1 -0
- package/dist/routes/variantRequestSchema.d.ts +4 -4
- package/dist/services/AuthService.js +2 -2
- package/dist/services/ConfigManager.d.ts +18 -1
- package/dist/services/ConfigManager.js +91 -4
- package/dist/services/GuidanceVerifierRunner.js +13 -2
- package/dist/services/SessionBridgeService.d.ts +0 -2
- package/dist/services/SessionBridgeService.js +0 -26
- package/dist/services/TelemetryService.d.ts +4 -15
- package/dist/services/TelemetryService.js +29 -33
- package/dist/services/VariantRunService.d.ts +0 -5
- package/dist/services/VariantRunService.js +0 -3
- package/dist/services/WorktreeManager.d.ts +0 -3
- package/dist/services/WorktreeManager.js +7 -54
- package/dist/services/createAgentVariantsOrchestrator.js +0 -1
- package/dist/services/profiles/DesignProfiles.js +4 -3
- package/dist/storage/library/ProjectPreviewCache.d.ts +2 -2
- package/dist/types/guidance-verifier.d.ts +458 -59
- package/dist/types/guidance-verifier.js +35 -12
- package/dist/utils/skills/claude-skill.d.ts +1 -1
- package/dist/utils/skills/claude-skill.js +1 -1
- package/dist/utils/skills/cli-guidance.d.ts +1 -1
- package/dist/utils/skills/cli-guidance.js +7 -9
- package/dist/utils/skills/cursor-rules.d.ts +1 -1
- package/dist/utils/skills/cursor-rules.js +1 -1
- package/package.json +3 -3
- package/src/ui/dist/assets/{LibraryEntry-BJl_pPMq.js → LibraryEntry-Cr4GFYXW.js} +9 -9
- package/src/ui/dist/assets/main-tPO1OCpZ.js +439 -0
- package/src/ui/dist/index.html +1 -1
- package/dist/agent-variants/createProjectArtifacts.d.ts +0 -61
- package/dist/agent-variants/createProjectArtifacts.js +0 -113
- 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 {};
|
|
@@ -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|
|
|
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
|
package/dist/cli/router.js
CHANGED
|
@@ -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|
|
|
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> ·
|
|
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);
|
package/dist/config/flags.d.ts
CHANGED
package/dist/config/flags.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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',
|
package/dist/routes/account.js
CHANGED
|
@@ -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.
|
|
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
|
-
|
|
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.
|
|
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?: "
|
|
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?: "
|
|
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?: "
|
|
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?: "
|
|
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.
|
|
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.
|
|
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;
|