rivet-design 0.26.2 → 0.27.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/dist/agent-variants/DirectionRefReservations.d.ts +11 -0
- package/dist/agent-variants/DirectionRefReservations.js +47 -0
- package/dist/agent-variants/PreviewRuntime.js +20 -7
- package/dist/agent-variants/SessionStore.d.ts +10 -1
- package/dist/agent-variants/SessionStore.js +25 -2
- package/dist/agent-variants/WorkItemRequestTimes.d.ts +6 -0
- package/dist/agent-variants/WorkItemRequestTimes.js +21 -0
- package/dist/agent-variants/WorktreeOrchestrator.d.ts +2 -1
- package/dist/agent-variants/WorktreeOrchestrator.js +92 -78
- package/dist/agent-variants/contracts.d.ts +120 -116
- package/dist/agent-variants/existingStaticEntry.d.ts +34 -0
- package/dist/agent-variants/existingStaticEntry.js +136 -0
- package/dist/agent-variants/staticPreviewFiles.js +1 -1
- package/dist/agent-variants/variant-project-runtime.d.ts +2 -1
- package/dist/agent-variants/variantsTelemetry.d.ts +8 -0
- package/dist/agent-variants/variantsTelemetry.js +5 -0
- package/dist/agent-variants/workItemInput.d.ts +168 -146
- package/dist/agent-variants/workItemInput.js +12 -1
- package/dist/cli/commands/directionTarget.d.ts +23 -0
- package/dist/cli/commands/directionTarget.js +87 -0
- package/dist/cli/commands/mcpServe.js +1 -0
- package/dist/cli/commands/open.js +28 -4
- package/dist/cli/commands/serve.js +2 -0
- package/dist/cli/commands/variants.js +36 -43
- package/dist/cli/envelope.d.ts +1 -1
- package/dist/cli/envelope.js +1 -0
- package/dist/cli/handoff.d.ts +1 -0
- package/dist/cli/handoff.js +20 -4
- package/dist/cli/projectRuntimeUpgrade.d.ts +11 -0
- package/dist/cli/projectRuntimeUpgrade.js +43 -11
- package/dist/cli/router.js +1 -0
- package/dist/cli/telemetry.d.ts +10 -0
- package/dist/cli/telemetry.js +37 -1
- package/dist/config/pluginMetrics.js +38 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +14 -5
- package/dist/mcp/explorationSchema.js +1 -1
- package/dist/mcp/getExploration.js +11 -5
- package/dist/proxy-middleware/proxy-config.js +7 -0
- package/dist/routes/agentVariants.js +4 -0
- package/dist/routes/cli.js +10 -1
- package/dist/routes/library/middleware.js +11 -5
- package/dist/server.js +20 -6
- package/dist/services/DependencyPreparationService.js +57 -19
- package/dist/services/GuidanceVerifierRunner.js +4 -4
- package/dist/services/ProjectLibrary.d.ts +4 -1
- package/dist/services/ProjectLibrary.js +14 -9
- package/dist/services/ProjectPackageManager.d.ts +5 -0
- package/dist/services/ProjectPackageManager.js +33 -11
- package/dist/services/ProjectRuntimeService.d.ts +8 -0
- package/dist/services/ProjectRuntimeService.js +15 -2
- package/dist/services/TelemetryService.d.ts +13 -2
- package/dist/services/TelemetryService.js +29 -0
- package/dist/services/VariantHistoryService.d.ts +8 -0
- package/dist/services/VariantHistoryService.js +40 -0
- package/dist/services/WorktreeManager.d.ts +1 -0
- package/dist/services/WorktreeManager.js +17 -0
- package/dist/services/createAgentVariantsOrchestrator.js +9 -2
- package/dist/services/directionRefs.d.ts +21 -0
- package/dist/services/directionRefs.js +148 -0
- package/dist/services/profiles/DesignProfiles.js +16 -8
- package/dist/services/projectDirections.d.ts +22 -0
- package/dist/services/projectDirections.js +38 -0
- package/dist/types/direction-ref.d.ts +36 -0
- package/dist/types/direction-ref.js +3 -0
- package/dist/types/guidance-verifier.d.ts +7 -5
- package/dist/types/guidance-verifier.js +14 -1
- package/dist/types/variant-history.d.ts +3 -1
- package/dist/utils/devServerError.d.ts +5 -0
- package/dist/utils/devServerError.js +4 -0
- package/dist/utils/failureReason.d.ts +16 -0
- package/dist/utils/failureReason.js +106 -0
- package/dist/utils/hostedLogPrivacy.d.ts +1 -0
- package/dist/utils/hostedLogPrivacy.js +10 -4
- 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 -6
- package/dist/utils/skills/cursor-rules.d.ts +1 -1
- package/dist/utils/skills/cursor-rules.js +1 -1
- package/dist/utils/subprocessEnvironment.d.ts +1 -1
- package/dist/utils/subprocessEnvironment.js +0 -1
- package/package.json +4 -4
- package/src/ui/dist/assets/LibraryEntry-BZ5EdFgA.js +37 -0
- package/src/ui/dist/assets/main-MepMmTwb.css +1 -0
- package/src/ui/dist/assets/main-RriU35pI.js +497 -0
- package/src/ui/dist/index.html +2 -2
- package/dist/services/StaticPreviewServer.d.ts +0 -8
- package/dist/services/StaticPreviewServer.js +0 -207
- package/src/ui/dist/assets/LibraryEntry-92R_T-Xa.js +0 -37
- package/src/ui/dist/assets/main-D0UmAaUe.css +0 -1
- package/src/ui/dist/assets/main-DgEfJvYu.js +0 -497
- package/src/ui/dist/fonts/Goldman-Bold.woff2 +0 -0
- package/src/ui/dist/fonts/Goldman-Regular.woff2 +0 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { WorktreeRecord } from './WorkspaceInventory';
|
|
2
|
+
import type { ProjectEnvironment, WorktreeManagerLike } from './variant-project-runtime';
|
|
3
|
+
import { type VariantsTelemetry } from './variantsTelemetry';
|
|
4
|
+
export type ExistingStaticEntrySource = 'configured' | 'root_page' | 'changed_page';
|
|
5
|
+
export type ExistingStaticEntry = {
|
|
6
|
+
kind: 'found';
|
|
7
|
+
entryPath: string;
|
|
8
|
+
source: ExistingStaticEntrySource;
|
|
9
|
+
} | {
|
|
10
|
+
kind: 'missing';
|
|
11
|
+
detail: string;
|
|
12
|
+
source: 'configured' | 'none';
|
|
13
|
+
};
|
|
14
|
+
export type ExistingStaticPreviewEntry = {
|
|
15
|
+
kind: 'unresolved';
|
|
16
|
+
} | (ExistingStaticEntry & {
|
|
17
|
+
hostProjectPath: string;
|
|
18
|
+
projectDirectory: string;
|
|
19
|
+
startedAt: number;
|
|
20
|
+
});
|
|
21
|
+
export declare const resolveExistingStaticEntry: (args: {
|
|
22
|
+
worktreePath: string;
|
|
23
|
+
projectDirectory: string;
|
|
24
|
+
configuredEntryPath: string | undefined;
|
|
25
|
+
changedFiles: string[];
|
|
26
|
+
}) => Promise<ExistingStaticEntry>;
|
|
27
|
+
export declare const resolveExistingStaticPreviewEntry: (args: {
|
|
28
|
+
sessionId: string;
|
|
29
|
+
record: WorktreeRecord;
|
|
30
|
+
resolveEnv: (sessionId: string) => Promise<ProjectEnvironment>;
|
|
31
|
+
worktrees: WorktreeManagerLike;
|
|
32
|
+
telemetry: VariantsTelemetry;
|
|
33
|
+
}) => Promise<ExistingStaticPreviewEntry | undefined>;
|
|
34
|
+
//# sourceMappingURL=existingStaticEntry.d.ts.map
|
|
@@ -0,0 +1,136 @@
|
|
|
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.resolveExistingStaticPreviewEntry = exports.resolveExistingStaticEntry = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const staticProjectTarget_1 = require("../services/staticProjectTarget");
|
|
10
|
+
const pathContainment_1 = require("../utils/pathContainment");
|
|
11
|
+
const logger_1 = require("../utils/logger");
|
|
12
|
+
const variantsTelemetry_1 = require("./variantsTelemetry");
|
|
13
|
+
const log = (0, logger_1.createLogger)('ExistingStaticEntry');
|
|
14
|
+
const INDEX_PAGE = 'index.html';
|
|
15
|
+
const MISSING_PAGE_DETAIL = "This project has no index.html or package.json at its root, and this direction didn't add or change an HTML page. " +
|
|
16
|
+
"Run rivet open on the folder that contains your app's package.json or index.html, or pass --entry <page.html>.";
|
|
17
|
+
const missingConfiguredEntryDetail = (entryPath) => `${entryPath} isn't in this direction's copy of the project. Directions start from committed and untracked files; ` +
|
|
18
|
+
`git-ignored files are left out. Commit ${entryPath} or remove it from .gitignore, then generate the direction again.`;
|
|
19
|
+
const isPageInsideWorktree = async (worktreePath, pagePath) => {
|
|
20
|
+
const realPage = await (0, pathContainment_1.resolveRealPathWithinRoot)({
|
|
21
|
+
root: worktreePath,
|
|
22
|
+
candidate: pagePath,
|
|
23
|
+
containment: 'strict',
|
|
24
|
+
});
|
|
25
|
+
if (!realPage)
|
|
26
|
+
return false;
|
|
27
|
+
try {
|
|
28
|
+
await fs_1.default.promises.access(realPage, fs_1.default.constants.R_OK);
|
|
29
|
+
return (await fs_1.default.promises.stat(realPage)).isFile();
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
const pageDepth = (pagePath) => pagePath.split('/').length;
|
|
36
|
+
const isIndexPage = (pagePath) => path_1.default.posix.basename(pagePath).toLowerCase() === INDEX_PAGE;
|
|
37
|
+
const comparePreviewPages = (left, right) => pageDepth(left) - pageDepth(right) ||
|
|
38
|
+
Number(isIndexPage(right)) - Number(isIndexPage(left)) ||
|
|
39
|
+
left.localeCompare(right);
|
|
40
|
+
const findRootPage = (projectDirectory) => {
|
|
41
|
+
try {
|
|
42
|
+
return (0, staticProjectTarget_1.resolveStaticProjectTarget)({ targetPath: projectDirectory })
|
|
43
|
+
.entryPath;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const toProjectPagePaths = (args) => args.changedFiles
|
|
50
|
+
.map((changedFile) => path_1.default.join(args.worktreePath, changedFile))
|
|
51
|
+
.filter((changedPath) => (0, pathContainment_1.isPathStrictlyInsideRoot)(args.projectDirectory, changedPath) &&
|
|
52
|
+
(0, staticProjectTarget_1.isStaticHtmlFilePath)(changedPath))
|
|
53
|
+
.map((changedPath) => path_1.default
|
|
54
|
+
.relative(args.projectDirectory, changedPath)
|
|
55
|
+
.split(path_1.default.sep)
|
|
56
|
+
.join('/'))
|
|
57
|
+
.sort(comparePreviewPages);
|
|
58
|
+
const resolveExistingStaticEntry = async (args) => {
|
|
59
|
+
const isProjectPage = (entryPath) => isPageInsideWorktree(args.worktreePath, path_1.default.join(args.projectDirectory, entryPath));
|
|
60
|
+
if (args.configuredEntryPath) {
|
|
61
|
+
return (await isProjectPage(args.configuredEntryPath))
|
|
62
|
+
? {
|
|
63
|
+
kind: 'found',
|
|
64
|
+
entryPath: args.configuredEntryPath,
|
|
65
|
+
source: 'configured',
|
|
66
|
+
}
|
|
67
|
+
: {
|
|
68
|
+
kind: 'missing',
|
|
69
|
+
detail: missingConfiguredEntryDetail(args.configuredEntryPath),
|
|
70
|
+
source: 'configured',
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
const rootPage = findRootPage(args.projectDirectory);
|
|
74
|
+
if (rootPage && (await isProjectPage(rootPage))) {
|
|
75
|
+
return { kind: 'found', entryPath: rootPage, source: 'root_page' };
|
|
76
|
+
}
|
|
77
|
+
for (const changedPage of toProjectPagePaths(args)) {
|
|
78
|
+
if (await isProjectPage(changedPage)) {
|
|
79
|
+
return { kind: 'found', entryPath: changedPage, source: 'changed_page' };
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return { kind: 'missing', detail: MISSING_PAGE_DETAIL, source: 'none' };
|
|
83
|
+
};
|
|
84
|
+
exports.resolveExistingStaticEntry = resolveExistingStaticEntry;
|
|
85
|
+
const resolveExistingStaticPreviewEntry = async (args) => {
|
|
86
|
+
const { sessionId, record } = args;
|
|
87
|
+
let env;
|
|
88
|
+
try {
|
|
89
|
+
env = await args.resolveEnv(sessionId);
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
log.warn(`resolveEnv failed for ${sessionId}`, err);
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
if (env.framework !== 'static')
|
|
96
|
+
return undefined;
|
|
97
|
+
const startedAt = Date.now();
|
|
98
|
+
(0, variantsTelemetry_1.trackPreviewStarted)(args.telemetry, {
|
|
99
|
+
sessionId,
|
|
100
|
+
variantId: record.workItemId,
|
|
101
|
+
projectContextKind: 'existing',
|
|
102
|
+
previewKind: 'static_artifact',
|
|
103
|
+
});
|
|
104
|
+
let projectDirectory;
|
|
105
|
+
try {
|
|
106
|
+
projectDirectory = await args.worktrees.getProjectCwdInWorktree(record.worktreePath);
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
log.warn(`project cwd failed for ${sessionId}/${record.workItemId}`, err);
|
|
110
|
+
return { kind: 'unresolved' };
|
|
111
|
+
}
|
|
112
|
+
let changedFiles = [];
|
|
113
|
+
if (!env.entryPath) {
|
|
114
|
+
try {
|
|
115
|
+
changedFiles =
|
|
116
|
+
(await args.worktrees.getChangedFiles?.(record.worktreePath)) ?? [];
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
log.warn(`changed files unavailable for ${sessionId}/${record.workItemId}`, err);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const entry = await (0, exports.resolveExistingStaticEntry)({
|
|
123
|
+
worktreePath: record.worktreePath,
|
|
124
|
+
projectDirectory,
|
|
125
|
+
configuredEntryPath: env.entryPath,
|
|
126
|
+
changedFiles,
|
|
127
|
+
});
|
|
128
|
+
return {
|
|
129
|
+
...entry,
|
|
130
|
+
hostProjectPath: env.projectPath,
|
|
131
|
+
projectDirectory,
|
|
132
|
+
startedAt,
|
|
133
|
+
};
|
|
134
|
+
};
|
|
135
|
+
exports.resolveExistingStaticPreviewEntry = resolveExistingStaticPreviewEntry;
|
|
136
|
+
//# sourceMappingURL=existingStaticEntry.js.map
|
|
@@ -33,7 +33,7 @@ const prepareStaticPreviewProjectFiles = ({ sourceDir, entryPath, isWebsite, })
|
|
|
33
33
|
exports.prepareStaticPreviewProjectFiles = prepareStaticPreviewProjectFiles;
|
|
34
34
|
const stageStaticPreviewFiles = ({ preview, workItemId, environment, isWebsite, briefMarkdown, }) => {
|
|
35
35
|
const rootPath = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), `rivet-variant-${workItemId}-`));
|
|
36
|
-
const siteDirectory = isWebsite && environment?.framework === 'static'
|
|
36
|
+
const siteDirectory = isWebsite && environment?.framework === 'static' && environment.entryPath
|
|
37
37
|
? path_1.default.dirname(environment.entryPath)
|
|
38
38
|
: '.';
|
|
39
39
|
try {
|
|
@@ -14,6 +14,7 @@ export interface WorktreeManagerLike {
|
|
|
14
14
|
startDevServer(worktreePath: string, port: number, cmd: string, args: string[], env: Record<string, string>): Promise<ChildProcess>;
|
|
15
15
|
stopDevServer(proc: ChildProcess, timeoutMs?: number): Promise<void>;
|
|
16
16
|
getProjectCwdInWorktree(worktreePath: string): Promise<string>;
|
|
17
|
+
getChangedFiles?(worktreePath: string): Promise<string[]>;
|
|
17
18
|
createFreshWorktrees?(sessionId: string, count: number, template: TemplateBundle, designContext: ReadonlyArray<DesignContextEntry | undefined> | undefined, destinationParent: string): Promise<string[]>;
|
|
18
19
|
}
|
|
19
20
|
type DevServerProjectEnvironment = {
|
|
@@ -31,7 +32,7 @@ type DevServerProjectEnvironment = {
|
|
|
31
32
|
type StaticProjectEnvironment = {
|
|
32
33
|
projectPath: string;
|
|
33
34
|
framework: 'static';
|
|
34
|
-
entryPath
|
|
35
|
+
entryPath?: string;
|
|
35
36
|
};
|
|
36
37
|
export type ProjectEnvironment = DevServerProjectEnvironment | StaticProjectEnvironment;
|
|
37
38
|
export {};
|
|
@@ -48,6 +48,7 @@ export interface VariantsTelemetry {
|
|
|
48
48
|
exitCode?: number | null;
|
|
49
49
|
signal?: string | null;
|
|
50
50
|
missingDeps?: boolean;
|
|
51
|
+
error?: unknown;
|
|
51
52
|
}) => void;
|
|
52
53
|
trackAgentVariantsPreviewStarted?: (data: {
|
|
53
54
|
sessionId: string;
|
|
@@ -63,6 +64,7 @@ export interface VariantsTelemetry {
|
|
|
63
64
|
hasPort: boolean;
|
|
64
65
|
port?: number;
|
|
65
66
|
durationMs?: number | null;
|
|
67
|
+
staticEntrySource?: string;
|
|
66
68
|
}) => void;
|
|
67
69
|
trackAgentVariantsPreviewFailed?: (data: {
|
|
68
70
|
sessionId: string;
|
|
@@ -76,6 +78,8 @@ export interface VariantsTelemetry {
|
|
|
76
78
|
exitCode?: number | null;
|
|
77
79
|
signal?: string | null;
|
|
78
80
|
missingDeps?: boolean;
|
|
81
|
+
staticEntrySource?: string;
|
|
82
|
+
error?: unknown;
|
|
79
83
|
}) => void;
|
|
80
84
|
trackAgentVariantsBriefQuality?: (data: {
|
|
81
85
|
sessionId: string;
|
|
@@ -132,6 +136,7 @@ export declare const trackFreshDevServerFailed: (telemetry: VariantsTelemetry, d
|
|
|
132
136
|
exitCode?: number | null;
|
|
133
137
|
signal?: string | null;
|
|
134
138
|
missingDeps?: boolean;
|
|
139
|
+
error?: unknown;
|
|
135
140
|
}) => void;
|
|
136
141
|
export declare const trackPreviewStarted: (telemetry: VariantsTelemetry, data: {
|
|
137
142
|
sessionId: string;
|
|
@@ -147,6 +152,7 @@ export declare const trackPreviewReady: (telemetry: VariantsTelemetry, data: {
|
|
|
147
152
|
hasPort: boolean;
|
|
148
153
|
port?: number;
|
|
149
154
|
durationMs?: number | null;
|
|
155
|
+
staticEntrySource?: string;
|
|
150
156
|
}) => void;
|
|
151
157
|
export declare const trackPreviewFailed: (telemetry: VariantsTelemetry, data: {
|
|
152
158
|
sessionId: string;
|
|
@@ -160,6 +166,8 @@ export declare const trackPreviewFailed: (telemetry: VariantsTelemetry, data: {
|
|
|
160
166
|
exitCode?: number | null;
|
|
161
167
|
signal?: string | null;
|
|
162
168
|
missingDeps?: boolean;
|
|
169
|
+
staticEntrySource?: string;
|
|
170
|
+
error?: unknown;
|
|
163
171
|
}) => void;
|
|
164
172
|
export declare const trackStaticPreviewCompleted: (telemetry: VariantsTelemetry, data: {
|
|
165
173
|
sessionId: string;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.trackStaticPreviewCompleted = exports.trackPreviewFailed = exports.trackPreviewReady = exports.trackPreviewStarted = exports.trackFreshDevServerFailed = exports.trackFreshDevServerStarted = exports.trackScaffoldFailed = exports.trackScaffoldCompleted = exports.trackScaffoldStarted = exports.summarizeDesignContext = exports.NOOP_TELEMETRY = void 0;
|
|
4
|
+
const failureReason_1 = require("../utils/failureReason");
|
|
4
5
|
exports.NOOP_TELEMETRY = { track: () => undefined };
|
|
5
6
|
const summarizeDesignContext = (designContext) => {
|
|
6
7
|
if (!designContext)
|
|
@@ -89,6 +90,7 @@ const trackFreshDevServerFailed = (telemetry, data) => {
|
|
|
89
90
|
exit_code: data.exitCode,
|
|
90
91
|
term_signal: data.signal,
|
|
91
92
|
missing_deps: data.missingDeps,
|
|
93
|
+
...(0, failureReason_1.failureReasonProperties)(data.error),
|
|
92
94
|
});
|
|
93
95
|
};
|
|
94
96
|
exports.trackFreshDevServerFailed = trackFreshDevServerFailed;
|
|
@@ -120,6 +122,7 @@ const trackPreviewReady = (telemetry, data) => {
|
|
|
120
122
|
has_port: data.hasPort,
|
|
121
123
|
port: data.port,
|
|
122
124
|
duration_ms: data.durationMs,
|
|
125
|
+
static_entry_source: data.staticEntrySource,
|
|
123
126
|
});
|
|
124
127
|
};
|
|
125
128
|
exports.trackPreviewReady = trackPreviewReady;
|
|
@@ -141,6 +144,8 @@ const trackPreviewFailed = (telemetry, data) => {
|
|
|
141
144
|
exit_code: data.exitCode,
|
|
142
145
|
term_signal: data.signal,
|
|
143
146
|
missing_deps: data.missingDeps,
|
|
147
|
+
static_entry_source: data.staticEntrySource,
|
|
148
|
+
...(0, failureReason_1.failureReasonProperties)(data.error),
|
|
144
149
|
});
|
|
145
150
|
};
|
|
146
151
|
exports.trackPreviewFailed = trackPreviewFailed;
|