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.
Files changed (94) hide show
  1. package/dist/agent-variants/DirectionRefReservations.d.ts +11 -0
  2. package/dist/agent-variants/DirectionRefReservations.js +47 -0
  3. package/dist/agent-variants/PreviewRuntime.js +20 -7
  4. package/dist/agent-variants/SessionStore.d.ts +10 -1
  5. package/dist/agent-variants/SessionStore.js +25 -2
  6. package/dist/agent-variants/WorkItemRequestTimes.d.ts +6 -0
  7. package/dist/agent-variants/WorkItemRequestTimes.js +21 -0
  8. package/dist/agent-variants/WorktreeOrchestrator.d.ts +2 -1
  9. package/dist/agent-variants/WorktreeOrchestrator.js +92 -78
  10. package/dist/agent-variants/contracts.d.ts +120 -116
  11. package/dist/agent-variants/existingStaticEntry.d.ts +34 -0
  12. package/dist/agent-variants/existingStaticEntry.js +136 -0
  13. package/dist/agent-variants/staticPreviewFiles.js +1 -1
  14. package/dist/agent-variants/variant-project-runtime.d.ts +2 -1
  15. package/dist/agent-variants/variantsTelemetry.d.ts +8 -0
  16. package/dist/agent-variants/variantsTelemetry.js +5 -0
  17. package/dist/agent-variants/workItemInput.d.ts +168 -146
  18. package/dist/agent-variants/workItemInput.js +12 -1
  19. package/dist/cli/commands/directionTarget.d.ts +23 -0
  20. package/dist/cli/commands/directionTarget.js +87 -0
  21. package/dist/cli/commands/mcpServe.js +1 -0
  22. package/dist/cli/commands/open.js +28 -4
  23. package/dist/cli/commands/serve.js +2 -0
  24. package/dist/cli/commands/variants.js +36 -43
  25. package/dist/cli/envelope.d.ts +1 -1
  26. package/dist/cli/envelope.js +1 -0
  27. package/dist/cli/handoff.d.ts +1 -0
  28. package/dist/cli/handoff.js +20 -4
  29. package/dist/cli/projectRuntimeUpgrade.d.ts +11 -0
  30. package/dist/cli/projectRuntimeUpgrade.js +43 -11
  31. package/dist/cli/router.js +1 -0
  32. package/dist/cli/telemetry.d.ts +10 -0
  33. package/dist/cli/telemetry.js +37 -1
  34. package/dist/config/pluginMetrics.js +38 -0
  35. package/dist/index.d.ts +19 -0
  36. package/dist/index.js +14 -5
  37. package/dist/mcp/explorationSchema.js +1 -1
  38. package/dist/mcp/getExploration.js +11 -5
  39. package/dist/proxy-middleware/proxy-config.js +7 -0
  40. package/dist/routes/agentVariants.js +4 -0
  41. package/dist/routes/cli.js +10 -1
  42. package/dist/routes/library/middleware.js +11 -5
  43. package/dist/server.js +20 -6
  44. package/dist/services/DependencyPreparationService.js +57 -19
  45. package/dist/services/GuidanceVerifierRunner.js +4 -4
  46. package/dist/services/ProjectLibrary.d.ts +4 -1
  47. package/dist/services/ProjectLibrary.js +14 -9
  48. package/dist/services/ProjectPackageManager.d.ts +5 -0
  49. package/dist/services/ProjectPackageManager.js +33 -11
  50. package/dist/services/ProjectRuntimeService.d.ts +8 -0
  51. package/dist/services/ProjectRuntimeService.js +15 -2
  52. package/dist/services/TelemetryService.d.ts +13 -2
  53. package/dist/services/TelemetryService.js +29 -0
  54. package/dist/services/VariantHistoryService.d.ts +8 -0
  55. package/dist/services/VariantHistoryService.js +40 -0
  56. package/dist/services/WorktreeManager.d.ts +1 -0
  57. package/dist/services/WorktreeManager.js +17 -0
  58. package/dist/services/createAgentVariantsOrchestrator.js +9 -2
  59. package/dist/services/directionRefs.d.ts +21 -0
  60. package/dist/services/directionRefs.js +148 -0
  61. package/dist/services/profiles/DesignProfiles.js +16 -8
  62. package/dist/services/projectDirections.d.ts +22 -0
  63. package/dist/services/projectDirections.js +38 -0
  64. package/dist/types/direction-ref.d.ts +36 -0
  65. package/dist/types/direction-ref.js +3 -0
  66. package/dist/types/guidance-verifier.d.ts +7 -5
  67. package/dist/types/guidance-verifier.js +14 -1
  68. package/dist/types/variant-history.d.ts +3 -1
  69. package/dist/utils/devServerError.d.ts +5 -0
  70. package/dist/utils/devServerError.js +4 -0
  71. package/dist/utils/failureReason.d.ts +16 -0
  72. package/dist/utils/failureReason.js +106 -0
  73. package/dist/utils/hostedLogPrivacy.d.ts +1 -0
  74. package/dist/utils/hostedLogPrivacy.js +10 -4
  75. package/dist/utils/skills/claude-skill.d.ts +1 -1
  76. package/dist/utils/skills/claude-skill.js +1 -1
  77. package/dist/utils/skills/cli-guidance.d.ts +1 -1
  78. package/dist/utils/skills/cli-guidance.js +7 -6
  79. package/dist/utils/skills/cursor-rules.d.ts +1 -1
  80. package/dist/utils/skills/cursor-rules.js +1 -1
  81. package/dist/utils/subprocessEnvironment.d.ts +1 -1
  82. package/dist/utils/subprocessEnvironment.js +0 -1
  83. package/package.json +4 -4
  84. package/src/ui/dist/assets/LibraryEntry-BZ5EdFgA.js +37 -0
  85. package/src/ui/dist/assets/main-MepMmTwb.css +1 -0
  86. package/src/ui/dist/assets/main-RriU35pI.js +497 -0
  87. package/src/ui/dist/index.html +2 -2
  88. package/dist/services/StaticPreviewServer.d.ts +0 -8
  89. package/dist/services/StaticPreviewServer.js +0 -207
  90. package/src/ui/dist/assets/LibraryEntry-92R_T-Xa.js +0 -37
  91. package/src/ui/dist/assets/main-D0UmAaUe.css +0 -1
  92. package/src/ui/dist/assets/main-DgEfJvYu.js +0 -497
  93. package/src/ui/dist/fonts/Goldman-Bold.woff2 +0 -0
  94. 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: string;
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;