rivet-design 0.16.3 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. package/README.md +8 -2
  2. package/README.npm.md +8 -2
  3. package/bin/rivet.js +15 -7
  4. package/dist/agent-variants/variantContext.d.ts +1 -0
  5. package/dist/agent-variants/variantContext.d.ts.map +1 -1
  6. package/dist/agent-variants/variantContext.js +1 -1
  7. package/dist/agent-variants/variantContext.js.map +1 -1
  8. package/dist/cli/commandNames.d.ts +2 -0
  9. package/dist/cli/commandNames.d.ts.map +1 -1
  10. package/dist/cli/commandNames.js +16 -1
  11. package/dist/cli/commandNames.js.map +1 -1
  12. package/dist/cli/commands/libraryOpen.d.ts +10 -0
  13. package/dist/cli/commands/libraryOpen.d.ts.map +1 -0
  14. package/dist/cli/commands/libraryOpen.js +126 -0
  15. package/dist/cli/commands/libraryOpen.js.map +1 -0
  16. package/dist/cli/commands/open.d.ts +39 -0
  17. package/dist/cli/commands/open.d.ts.map +1 -1
  18. package/dist/cli/commands/open.js +35 -21
  19. package/dist/cli/commands/open.js.map +1 -1
  20. package/dist/cli/commands/serve.d.ts.map +1 -1
  21. package/dist/cli/commands/serve.js +33 -0
  22. package/dist/cli/commands/serve.js.map +1 -1
  23. package/dist/cli/router.d.ts.map +1 -1
  24. package/dist/cli/router.js +34 -3
  25. package/dist/cli/router.js.map +1 -1
  26. package/dist/cli/serverHandshake.d.ts +7 -5
  27. package/dist/cli/serverHandshake.d.ts.map +1 -1
  28. package/dist/cli/serverHandshake.js +16 -12
  29. package/dist/cli/serverHandshake.js.map +1 -1
  30. package/dist/install/installationChannel.d.ts +4 -0
  31. package/dist/install/installationChannel.d.ts.map +1 -0
  32. package/dist/install/installationChannel.js +13 -0
  33. package/dist/install/installationChannel.js.map +1 -0
  34. package/dist/library/HubClient.d.ts +12 -0
  35. package/dist/library/HubClient.d.ts.map +1 -0
  36. package/dist/library/HubClient.js +109 -0
  37. package/dist/library/HubClient.js.map +1 -0
  38. package/dist/library/HubServer.d.ts +16 -0
  39. package/dist/library/HubServer.d.ts.map +1 -0
  40. package/dist/library/HubServer.js +95 -0
  41. package/dist/library/HubServer.js.map +1 -0
  42. package/dist/library/StaticPreviewServer.d.ts +7 -0
  43. package/dist/library/StaticPreviewServer.d.ts.map +1 -0
  44. package/dist/library/StaticPreviewServer.js +18 -0
  45. package/dist/library/StaticPreviewServer.js.map +1 -0
  46. package/dist/library/http.d.ts +11 -0
  47. package/dist/library/http.d.ts.map +1 -0
  48. package/dist/library/http.js +31 -0
  49. package/dist/library/http.js.map +1 -0
  50. package/dist/library/importFiles.d.ts +18 -0
  51. package/dist/library/importFiles.d.ts.map +1 -0
  52. package/dist/library/importFiles.js +184 -0
  53. package/dist/library/importFiles.js.map +1 -0
  54. package/dist/routes/account.d.ts +4 -0
  55. package/dist/routes/account.d.ts.map +1 -0
  56. package/dist/routes/account.js +53 -0
  57. package/dist/routes/account.js.map +1 -0
  58. package/dist/routes/agentVariants.d.ts +2 -13
  59. package/dist/routes/agentVariants.d.ts.map +1 -1
  60. package/dist/routes/agentVariants.js +13 -45
  61. package/dist/routes/agentVariants.js.map +1 -1
  62. package/dist/routes/library/app.d.ts +8 -0
  63. package/dist/routes/library/app.d.ts.map +1 -0
  64. package/dist/routes/library/app.js +26 -0
  65. package/dist/routes/library/app.js.map +1 -0
  66. package/dist/routes/library/index.d.ts +5 -0
  67. package/dist/routes/library/index.d.ts.map +1 -0
  68. package/dist/routes/library/index.js +32 -0
  69. package/dist/routes/library/index.js.map +1 -0
  70. package/dist/routes/library/middleware.d.ts +9 -0
  71. package/dist/routes/library/middleware.d.ts.map +1 -0
  72. package/dist/routes/library/middleware.js +58 -0
  73. package/dist/routes/library/middleware.js.map +1 -0
  74. package/dist/routes/library/navigation.d.ts +5 -0
  75. package/dist/routes/library/navigation.d.ts.map +1 -0
  76. package/dist/routes/library/navigation.js +39 -0
  77. package/dist/routes/library/navigation.js.map +1 -0
  78. package/dist/routes/library/projects.d.ts +5 -0
  79. package/dist/routes/library/projects.d.ts.map +1 -0
  80. package/dist/routes/library/projects.js +42 -0
  81. package/dist/routes/library/projects.js.map +1 -0
  82. package/dist/routes/library/schemas.d.ts +23 -0
  83. package/dist/routes/library/schemas.d.ts.map +1 -0
  84. package/dist/routes/library/schemas.js +10 -0
  85. package/dist/routes/library/schemas.js.map +1 -0
  86. package/dist/routes/library/staticPreview.d.ts +4 -0
  87. package/dist/routes/library/staticPreview.d.ts.map +1 -0
  88. package/dist/routes/library/staticPreview.js +39 -0
  89. package/dist/routes/library/staticPreview.js.map +1 -0
  90. package/dist/routes/library/types.d.ts +22 -0
  91. package/dist/routes/library/types.d.ts.map +1 -0
  92. package/dist/routes/library/types.js +3 -0
  93. package/dist/routes/library/types.js.map +1 -0
  94. package/dist/routes/library/variants.d.ts +5 -0
  95. package/dist/routes/library/variants.d.ts.map +1 -0
  96. package/dist/routes/library/variants.js +35 -0
  97. package/dist/routes/library/variants.js.map +1 -0
  98. package/dist/server.d.ts +2 -0
  99. package/dist/server.d.ts.map +1 -1
  100. package/dist/server.js +18 -30
  101. package/dist/server.js.map +1 -1
  102. package/dist/services/HistoryReplayService.js +1 -1
  103. package/dist/services/HistoryReplayService.js.map +1 -1
  104. package/dist/services/HubDiscovery.d.ts +46 -0
  105. package/dist/services/HubDiscovery.d.ts.map +1 -0
  106. package/dist/services/HubDiscovery.js +58 -0
  107. package/dist/services/HubDiscovery.js.map +1 -0
  108. package/dist/services/HubNavigation.d.ts +36 -0
  109. package/dist/services/HubNavigation.d.ts.map +1 -0
  110. package/dist/services/HubNavigation.js +76 -0
  111. package/dist/services/HubNavigation.js.map +1 -0
  112. package/dist/services/ProjectCardPreviews.d.ts +27 -0
  113. package/dist/services/ProjectCardPreviews.d.ts.map +1 -0
  114. package/dist/services/ProjectCardPreviews.js +112 -0
  115. package/dist/services/ProjectCardPreviews.js.map +1 -0
  116. package/dist/services/ProjectFolderPicker.d.ts +20 -0
  117. package/dist/services/ProjectFolderPicker.d.ts.map +1 -0
  118. package/dist/services/ProjectFolderPicker.js +174 -0
  119. package/dist/services/ProjectFolderPicker.js.map +1 -0
  120. package/dist/services/ProjectImport.d.ts +13 -0
  121. package/dist/services/ProjectImport.d.ts.map +1 -0
  122. package/dist/services/ProjectImport.js +226 -0
  123. package/dist/services/ProjectImport.js.map +1 -0
  124. package/dist/services/ProjectLibrary.d.ts +74 -0
  125. package/dist/services/ProjectLibrary.d.ts.map +1 -0
  126. package/dist/services/ProjectLibrary.js +261 -0
  127. package/dist/services/ProjectLibrary.js.map +1 -0
  128. package/dist/services/ProjectMetadataStore.d.ts +6 -19
  129. package/dist/services/ProjectMetadataStore.d.ts.map +1 -1
  130. package/dist/services/ProjectMetadataStore.js +29 -147
  131. package/dist/services/ProjectMetadataStore.js.map +1 -1
  132. package/dist/services/ProjectRegistry.d.ts +80 -0
  133. package/dist/services/ProjectRegistry.d.ts.map +1 -0
  134. package/dist/services/ProjectRegistry.js +147 -0
  135. package/dist/services/ProjectRegistry.js.map +1 -0
  136. package/dist/services/ProjectRuntimeService.d.ts +18 -0
  137. package/dist/services/ProjectRuntimeService.d.ts.map +1 -0
  138. package/dist/services/ProjectRuntimeService.js +143 -0
  139. package/dist/services/ProjectRuntimeService.js.map +1 -0
  140. package/dist/services/ProjectScreenshotService.d.ts +15 -0
  141. package/dist/services/ProjectScreenshotService.d.ts.map +1 -0
  142. package/dist/services/ProjectScreenshotService.js +90 -0
  143. package/dist/services/ProjectScreenshotService.js.map +1 -0
  144. package/dist/services/ProjectStorage.d.ts +20 -0
  145. package/dist/services/ProjectStorage.d.ts.map +1 -0
  146. package/dist/services/ProjectStorage.js +41 -0
  147. package/dist/services/ProjectStorage.js.map +1 -0
  148. package/dist/services/StaticLibraryPreviews.d.ts +21 -0
  149. package/dist/services/StaticLibraryPreviews.d.ts.map +1 -0
  150. package/dist/services/StaticLibraryPreviews.js +61 -0
  151. package/dist/services/StaticLibraryPreviews.js.map +1 -0
  152. package/dist/services/TelemetryService.d.ts +7 -0
  153. package/dist/services/TelemetryService.d.ts.map +1 -1
  154. package/dist/services/TelemetryService.js +7 -1
  155. package/dist/services/TelemetryService.js.map +1 -1
  156. package/dist/services/TreeStore.d.ts +8 -3
  157. package/dist/services/TreeStore.d.ts.map +1 -1
  158. package/dist/services/TreeStore.js +39 -18
  159. package/dist/services/TreeStore.js.map +1 -1
  160. package/dist/services/VariantGenerationService.d.ts +5 -0
  161. package/dist/services/VariantGenerationService.d.ts.map +1 -1
  162. package/dist/services/VariantGenerationService.js +13 -1
  163. package/dist/services/VariantGenerationService.js.map +1 -1
  164. package/dist/services/VariantHistoryService.d.ts +17 -162
  165. package/dist/services/VariantHistoryService.d.ts.map +1 -1
  166. package/dist/services/VariantHistoryService.js +186 -45
  167. package/dist/services/VariantHistoryService.js.map +1 -1
  168. package/dist/services/VariantRunService.d.ts +3 -0
  169. package/dist/services/VariantRunService.d.ts.map +1 -1
  170. package/dist/services/VariantRunService.js +2 -0
  171. package/dist/services/VariantRunService.js.map +1 -1
  172. package/dist/services/VariantsRuntime.d.ts +4 -0
  173. package/dist/services/VariantsRuntime.d.ts.map +1 -1
  174. package/dist/services/VariantsRuntime.js +6 -1
  175. package/dist/services/VariantsRuntime.js.map +1 -1
  176. package/dist/services/createAgentVariantsOrchestrator.d.ts +2 -0
  177. package/dist/services/createAgentVariantsOrchestrator.d.ts.map +1 -1
  178. package/dist/services/createAgentVariantsOrchestrator.js +1 -0
  179. package/dist/services/createAgentVariantsOrchestrator.js.map +1 -1
  180. package/dist/services/historyRoots.d.ts +14 -0
  181. package/dist/services/historyRoots.d.ts.map +1 -0
  182. package/dist/services/historyRoots.js +44 -0
  183. package/dist/services/historyRoots.js.map +1 -0
  184. package/dist/services/libraryErrors.d.ts +7 -0
  185. package/dist/services/libraryErrors.d.ts.map +1 -0
  186. package/dist/services/libraryErrors.js +14 -0
  187. package/dist/services/libraryErrors.js.map +1 -0
  188. package/dist/storage/library/BundleMetadataStore.d.ts +53 -0
  189. package/dist/storage/library/BundleMetadataStore.d.ts.map +1 -0
  190. package/dist/storage/library/BundleMetadataStore.js +317 -0
  191. package/dist/storage/library/BundleMetadataStore.js.map +1 -0
  192. package/dist/storage/library/CoordinatorRecords.d.ts +25 -0
  193. package/dist/storage/library/CoordinatorRecords.d.ts.map +1 -0
  194. package/dist/storage/library/CoordinatorRecords.js +84 -0
  195. package/dist/storage/library/CoordinatorRecords.js.map +1 -0
  196. package/dist/storage/library/ProjectPreviewCache.d.ts +34 -0
  197. package/dist/storage/library/ProjectPreviewCache.d.ts.map +1 -0
  198. package/dist/storage/library/ProjectPreviewCache.js +62 -0
  199. package/dist/storage/library/ProjectPreviewCache.js.map +1 -0
  200. package/dist/storage/library/ProjectRecords.d.ts +64 -0
  201. package/dist/storage/library/ProjectRecords.d.ts.map +1 -0
  202. package/dist/storage/library/ProjectRecords.js +139 -0
  203. package/dist/storage/library/ProjectRecords.js.map +1 -0
  204. package/dist/storage/library/database.d.ts +13 -0
  205. package/dist/storage/library/database.d.ts.map +1 -0
  206. package/dist/storage/library/database.js +106 -0
  207. package/dist/storage/library/database.js.map +1 -0
  208. package/dist/storage/library/migrations.d.ts +5 -0
  209. package/dist/storage/library/migrations.d.ts.map +1 -0
  210. package/dist/storage/library/migrations.js +61 -0
  211. package/dist/storage/library/migrations.js.map +1 -0
  212. package/dist/storage/library/schema/bundle.d.ts +734 -0
  213. package/dist/storage/library/schema/bundle.d.ts.map +1 -0
  214. package/dist/storage/library/schema/bundle.js +79 -0
  215. package/dist/storage/library/schema/bundle.js.map +1 -0
  216. package/dist/storage/library/schema/coordinator.d.ts +72 -0
  217. package/dist/storage/library/schema/coordinator.d.ts.map +1 -0
  218. package/dist/storage/library/schema/coordinator.js +12 -0
  219. package/dist/storage/library/schema/coordinator.js.map +1 -0
  220. package/dist/storage/library/schema/registry.d.ts +198 -0
  221. package/dist/storage/library/schema/registry.d.ts.map +1 -0
  222. package/dist/storage/library/schema/registry.js +32 -0
  223. package/dist/storage/library/schema/registry.js.map +1 -0
  224. package/dist/storage/library/sourcePresentation.d.ts +3 -0
  225. package/dist/storage/library/sourcePresentation.d.ts.map +1 -0
  226. package/dist/storage/library/sourcePresentation.js +70 -0
  227. package/dist/storage/library/sourcePresentation.js.map +1 -0
  228. package/dist/storage/project-metadata/ProjectMetadataRecords.d.ts +41 -0
  229. package/dist/storage/project-metadata/ProjectMetadataRecords.d.ts.map +1 -0
  230. package/dist/storage/project-metadata/ProjectMetadataRecords.js +120 -0
  231. package/dist/storage/project-metadata/ProjectMetadataRecords.js.map +1 -0
  232. package/dist/storage/project-metadata/database.d.ts +12 -0
  233. package/dist/storage/project-metadata/database.d.ts.map +1 -0
  234. package/dist/storage/project-metadata/database.js +79 -0
  235. package/dist/storage/project-metadata/database.js.map +1 -0
  236. package/dist/{services/projectMetadataMigrations.d.ts → storage/project-metadata/migrations.d.ts} +1 -1
  237. package/dist/storage/project-metadata/migrations.d.ts.map +1 -0
  238. package/dist/{services/projectMetadataMigrations.js → storage/project-metadata/migrations.js} +1 -1
  239. package/dist/storage/project-metadata/migrations.js.map +1 -0
  240. package/dist/storage/project-metadata/schema.d.ts +288 -0
  241. package/dist/storage/project-metadata/schema.d.ts.map +1 -0
  242. package/dist/storage/project-metadata/schema.js +35 -0
  243. package/dist/storage/project-metadata/schema.js.map +1 -0
  244. package/dist/types/account.d.ts +8 -0
  245. package/dist/types/account.d.ts.map +1 -0
  246. package/dist/types/account.js +3 -0
  247. package/dist/types/account.js.map +1 -0
  248. package/dist/types/project-library.d.ts +28 -0
  249. package/dist/types/project-library.d.ts.map +1 -0
  250. package/dist/types/project-library.js +3 -0
  251. package/dist/types/project-library.js.map +1 -0
  252. package/dist/types/variant-history.d.ts +173 -0
  253. package/dist/types/variant-history.d.ts.map +1 -0
  254. package/dist/types/variant-history.js +3 -0
  255. package/dist/types/variant-history.js.map +1 -0
  256. package/dist/utils/windowPlacement.d.ts +20 -0
  257. package/dist/utils/windowPlacement.d.ts.map +1 -0
  258. package/dist/utils/windowPlacement.js +20 -0
  259. package/dist/utils/windowPlacement.js.map +1 -0
  260. package/package.json +8 -3
  261. package/scripts/verify-node-version.cjs +9 -6
  262. package/src/ui/dist/assets/LibraryApp-B2MZyxIp.js +16 -0
  263. package/src/ui/dist/assets/main-1IMq5Huu.css +1 -0
  264. package/src/ui/dist/assets/main-BId3Sa7r.js +438 -0
  265. package/src/ui/dist/favicon-16.png +0 -0
  266. package/src/ui/dist/favicon-32.png +0 -0
  267. package/src/ui/dist/favicon.ico +0 -0
  268. package/src/ui/dist/index.html +2 -2
  269. package/dist/services/projectMetadataMigrations.d.ts.map +0 -1
  270. package/dist/services/projectMetadataMigrations.js.map +0 -1
  271. package/src/ui/dist/assets/main-C1kowo8p.js +0 -438
  272. package/src/ui/dist/assets/main-Ct1aZend.css +0 -1
@@ -1,166 +1,8 @@
1
+ import type { VariantHistoryStatus, VariantHistoryKind, PersistVariantPreview, VariantServeSpec, VariantDesignSource, VariantDeployment, VariantCanvasDeployment, VariantHistoryManifest } from '../types/variant-history';
2
+ export type { VariantHistoryStatus, VariantHistoryKind, VariantHistoryPreview, PersistVariantPreview, VariantTreePointer, VariantBasePointer, DevServerRecipe, VariantServeSpec, VariantHistoryArtifact, VariantDesignSource, VariantDeployment, VariantCanvasDeployment, VariantHistoryManifest, VariantHistorySessionFile, } from '../types/variant-history';
3
+ import type { BundleMetadataStore } from '../storage/library/BundleMetadataStore';
1
4
  import { TreeStore } from './TreeStore';
2
5
  import { ProjectMetadataStore } from './ProjectMetadataStore';
3
- export type VariantHistoryStatus = 'completed' | 'committed' | 'rejected' | 'cancelled' | 'removed';
4
- export type VariantHistoryKind = 'diff' | 'project-created';
5
- export type VariantHistoryPreview = {
6
- kind: 'static';
7
- rootPath: 'files';
8
- entryPath: string;
9
- } | {
10
- kind: 'dev-server';
11
- rootPath: 'files';
12
- command: {
13
- cwd: string;
14
- packageManager: string;
15
- script: string;
16
- };
17
- runnablePath?: string;
18
- } | {
19
- kind: 'none';
20
- reason: 'diff_only' | 'missing_entry' | 'unsupported';
21
- };
22
- export type PersistVariantPreview = {
23
- kind: 'static';
24
- entryPath: string;
25
- } | {
26
- kind: 'dev-server';
27
- command: {
28
- cwd: string;
29
- packageManager: string;
30
- script: string;
31
- };
32
- runnablePath?: string;
33
- } | {
34
- kind: 'none';
35
- reason: 'diff_only' | 'missing_entry' | 'unsupported';
36
- };
37
- /** Pointer to the variant's exact tree in the project's {@link TreeStore}
38
- * (`.rivet/store.git`). Additive alongside the legacy artifact/preview
39
- * fields during the dual-write transition — see
40
- * docs/variant-history-tree-store-design.md. */
41
- export interface VariantTreePointer {
42
- ref: string;
43
- /** For diffs, replay materialization, and reflog. */
44
- commitSha: string;
45
- /** Content-addressed key for the static extraction cache. */
46
- treeSha: string;
47
- }
48
- /** The session base snapshot. ALWAYS the apply base: `diff(base, tree)`
49
- * yields the full variant state to apply to the working tree — including
50
- * for forked (Vary) variants, whose parent lineage is comparison-only. */
51
- export interface VariantBasePointer {
52
- ref: string;
53
- commitSha: string;
54
- }
55
- /** Port-parameterized dev-server invocation captured at persist time from
56
- * the resolution the live preview actually booted with. The literal command
57
- * can't be stored verbatim — the live resolution bakes the allocated port
58
- * into args/env, which would be dead at replay — so `${PORT}` placeholders
59
- * mark where replay substitutes its own allocated port. */
60
- export interface DevServerRecipe {
61
- /** Relative to the snapshot root ('.' for the root itself). */
62
- cwd: string;
63
- cmd: string;
64
- argsTemplate: string[];
65
- envTemplate?: Record<string, string>;
66
- }
67
- export type VariantServeSpec = {
68
- kind: 'static';
69
- entryPath: string;
70
- } | {
71
- kind: 'dev-server';
72
- recipe: DevServerRecipe;
73
- };
74
- export type VariantHistoryArtifact = {
75
- kind: 'diff';
76
- diffPath: 'diff.patch';
77
- filesPath?: 'files';
78
- } | {
79
- kind: 'project';
80
- filesPath: 'files';
81
- runnablePath?: string;
82
- };
83
- /** Where the persisted DESIGN.md came from. Slug entries point at a curated
84
- * catalog inspiration; markdown entries carry user-supplied / Agent Browser
85
- * extracted content. `label` is always human-readable for the history UI. */
86
- export interface VariantDesignSource {
87
- kind: 'slug' | 'markdown';
88
- label: string;
89
- /** Catalog slug — present only when `kind === 'slug'`. */
90
- slug?: string;
91
- }
92
- /** A public deployment of this variant to the Prototype Preview Host. Recorded
93
- * so the UI can re-show ("Copy link") an existing share URL instead of
94
- * re-building, and so repeated deploys accrue rather than clobber. */
95
- export interface VariantDeployment {
96
- deployId: string;
97
- shareUrl: string;
98
- deployedAt: string;
99
- }
100
- export interface VariantCanvasDeployment {
101
- deployId: string;
102
- shareUrl: string;
103
- deployedAt: string;
104
- variants: Array<{
105
- variantId: string;
106
- deployId: string;
107
- shareUrl: string;
108
- }>;
109
- }
110
- export interface VariantHistoryManifest {
111
- schemaVersion: number;
112
- variantId: string;
113
- sessionId: string;
114
- requestId?: string;
115
- label: string;
116
- brief: string;
117
- sessionPrompt: string;
118
- /** 1–2 word label for the run's intent (agent-supplied or heuristic). */
119
- runLabel?: string;
120
- projectKind: 'existing' | 'fresh';
121
- status: VariantHistoryStatus;
122
- createdAt: string;
123
- statusChangedAt: string;
124
- baseSha?: string;
125
- destinationPath?: string;
126
- changedFilesCount: number;
127
- artifact: VariantHistoryArtifact;
128
- preview: VariantHistoryPreview;
129
- /** Tree-store pointers + serve contract. Optional additions on the current
130
- * schemaVersion (readManifest hard-rejects version mismatches, so these
131
- * MUST stay additive); absent on legacy entries. */
132
- tree?: VariantTreePointer;
133
- base?: VariantBasePointer;
134
- /** Forked (Vary) variants: the parent variant's commit — for comparison
135
- * diffs ("what did this vary change?"), never for apply. */
136
- parent?: {
137
- ref: string;
138
- commitSha: string;
139
- };
140
- /** Source direction for forked (Vary) variants. Used by the UI to collapse
141
- * superseded parent runs without losing the derived rows. */
142
- parentVariant?: {
143
- sessionId: string;
144
- variantId: string;
145
- };
146
- serve?: VariantServeSpec;
147
- designSource?: VariantDesignSource;
148
- /** Public deploys, newest last. Absent until the variant is first deployed. */
149
- deployments?: VariantDeployment[];
150
- /** The runtime that executed this variant's worker (vendor/model/effort).
151
- * Additive on the current schemaVersion; absent on legacy entries and on
152
- * host-agent-executed variants. */
153
- runtime?: import('../agent-variants/contracts').WorkerRuntimeInfo;
154
- }
155
- export interface VariantHistorySessionFile {
156
- schemaVersion: number;
157
- sessionId: string;
158
- createdAt: string;
159
- sessionPrompt: string;
160
- projectKind: 'existing' | 'fresh';
161
- /** Public canvas deploys, newest last. Each canvas points at its included variants. */
162
- canvasDeployments?: VariantCanvasDeployment[];
163
- }
164
6
  export interface PersistVariantArgs {
165
7
  projectPath: string;
166
8
  sessionId: string;
@@ -241,17 +83,30 @@ export interface StaticPreviewFile {
241
83
  absolutePath: string;
242
84
  relativePath: string;
243
85
  }
86
+ interface HistoryStorageOptions {
87
+ /** Authoritative metadata for every working directory attached to storage. */
88
+ bundle?: BundleMetadataStore;
89
+ }
244
90
  export declare class VariantHistoryService {
91
+ private readonly storageOptions;
245
92
  private persistQueues;
246
93
  private readonly treeStore;
247
94
  private readonly metadataStore;
248
- constructor(treeStore?: TreeStore, metadataStore?: ProjectMetadataStore);
95
+ constructor(treeStore?: TreeStore, metadataStore?: ProjectMetadataStore, storageOptions?: HistoryStorageOptions);
249
96
  /** The tree store backing this history — exposed for consumers that serve
250
97
  * or replay snapshot trees (history preview route, replay service). */
251
98
  get store(): TreeStore;
252
99
  /** The SQLite metadata projection backing indexed reads — exposed for
253
100
  * consumers that search or inspect the index directly. */
254
101
  get metadata(): ProjectMetadataStore;
102
+ /** Resolves the authoritative metadata owner for a working folder. */
103
+ private bundleFor;
104
+ /** Reads presentation state from the project's authoritative metadata store. */
105
+ readVariantsUiState(projectPath: string): Promise<string | null>;
106
+ /** Persists presentation changes with the owning project's metadata. */
107
+ writeVariantsUiState(projectPath: string, json: string): Promise<void>;
108
+ /** Reads the published record, never a bundle's exported manifest file. */
109
+ private readPublishedManifest;
255
110
  variantsRoot(projectPath: string): string;
256
111
  sessionDir(projectPath: string, sessionId: string): string;
257
112
  variantDir(projectPath: string, sessionId: string, variantId: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"VariantHistoryService.d.ts","sourceRoot":"","sources":["../../src/services/VariantHistoryService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"VariantHistoryService.d.ts","sourceRoot":"","sources":["../../src/services/VariantHistoryService.ts"],"names":[],"mappings":"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"}
@@ -7,13 +7,13 @@ exports.VariantHistoryService = void 0;
7
7
  const fs_1 = __importDefault(require("fs"));
8
8
  const promises_1 = __importDefault(require("fs/promises"));
9
9
  const path_1 = __importDefault(require("path"));
10
+ const crypto_1 = require("crypto");
10
11
  const runLabel_1 = require("../agent-variants/runLabel");
11
12
  const logger_1 = require("../utils/logger");
12
13
  const TreeStore_1 = require("./TreeStore");
13
14
  const ProjectMetadataStore_1 = require("./ProjectMetadataStore");
14
15
  const log = (0, logger_1.createLogger)('VariantHistoryService');
15
16
  const HISTORY_SCHEMA_VERSION = 2;
16
- const RIVET_DIRNAME = '.rivet';
17
17
  const VARIANTS_DIRNAME = 'variants';
18
18
  const SESSION_FILENAME = 'session.json';
19
19
  const MANIFEST_FILENAME = 'manifest.json';
@@ -64,10 +64,12 @@ const assertSafeAssetPath = (value) => {
64
64
  }
65
65
  };
66
66
  class VariantHistoryService {
67
+ storageOptions;
67
68
  persistQueues = new Map();
68
69
  treeStore;
69
70
  metadataStore;
70
- constructor(treeStore = new TreeStore_1.TreeStore(), metadataStore = new ProjectMetadataStore_1.ProjectMetadataStore()) {
71
+ constructor(treeStore = new TreeStore_1.TreeStore(), metadataStore = new ProjectMetadataStore_1.ProjectMetadataStore(undefined, treeStore.storage), storageOptions = {}) {
72
+ this.storageOptions = storageOptions;
71
73
  this.treeStore = treeStore;
72
74
  this.metadataStore = metadataStore;
73
75
  }
@@ -81,13 +83,52 @@ class VariantHistoryService {
81
83
  get metadata() {
82
84
  return this.metadataStore;
83
85
  }
86
+ /** Resolves the authoritative metadata owner for a working folder. */
87
+ bundleFor(projectPath) {
88
+ const { bundle } = this.storageOptions;
89
+ return bundle && this.treeStore.storage.isAttached(projectPath)
90
+ ? bundle
91
+ : undefined;
92
+ }
93
+ /** Reads presentation state from the project's authoritative metadata store. */
94
+ async readVariantsUiState(projectPath) {
95
+ const bundle = this.bundleFor(projectPath);
96
+ if (!bundle)
97
+ return this.metadataStore.readVariantsUiState(projectPath);
98
+ const value = bundle.getPresentation();
99
+ return value === null ? null : JSON.stringify(value);
100
+ }
101
+ /** Persists presentation changes with the owning project's metadata. */
102
+ async writeVariantsUiState(projectPath, json) {
103
+ const bundle = this.bundleFor(projectPath);
104
+ if (bundle) {
105
+ bundle.setPresentation(JSON.parse(json));
106
+ return;
107
+ }
108
+ await this.metadataStore.writeVariantsUiState(projectPath, json);
109
+ }
110
+ /** Reads the published record, never a bundle's exported manifest file. */
111
+ async readPublishedManifest(args) {
112
+ const bundle = this.bundleFor(args.projectPath);
113
+ if (bundle)
114
+ return bundle.getVariant(args.sessionId, args.variantId);
115
+ return readManifest(path_1.default.join(this.variantDir(args.projectPath, args.sessionId, args.variantId), MANIFEST_FILENAME));
116
+ }
84
117
  variantsRoot(projectPath) {
85
- return path_1.default.join(projectPath, RIVET_DIRNAME, VARIANTS_DIRNAME);
118
+ return path_1.default.join(this.treeStore.storage.resolve(projectPath).dataDirectory, VARIANTS_DIRNAME);
86
119
  }
87
120
  sessionDir(projectPath, sessionId) {
88
121
  return path_1.default.join(this.variantsRoot(projectPath), sessionId);
89
122
  }
90
123
  variantDir(projectPath, sessionId, variantId) {
124
+ const artifactPath = this.bundleFor(projectPath)?.artifactPath(sessionId, variantId);
125
+ if (artifactPath) {
126
+ const dataDirectory = this.treeStore.storage.resolve(projectPath).dataDirectory;
127
+ const resolved = path_1.default.resolve(dataDirectory, artifactPath);
128
+ if (!resolved.startsWith(dataDirectory + path_1.default.sep))
129
+ throw new Error('Artifact path escapes project data');
130
+ return resolved;
131
+ }
91
132
  return path_1.default.join(this.sessionDir(projectPath, sessionId), variantId);
92
133
  }
93
134
  /**
@@ -121,6 +162,7 @@ class VariantHistoryService {
121
162
  * @effect Writes manifest and artifact files into a staged directory before replacing the persisted variant directory.
122
163
  */
123
164
  async persistVariantEntry(args) {
165
+ const bundle = this.bundleFor(args.projectPath);
124
166
  const sessionDir = this.sessionDir(args.projectPath, args.sessionId);
125
167
  const variantDir = this.variantDir(args.projectPath, args.sessionId, args.variantId);
126
168
  await promises_1.default.mkdir(sessionDir, { recursive: true });
@@ -139,8 +181,13 @@ class VariantHistoryService {
139
181
  let preservedParent;
140
182
  let preservedServe;
141
183
  try {
142
- const raw = await promises_1.default.readFile(existingManifestPath, 'utf8');
143
- const prior = JSON.parse(raw);
184
+ const prior = bundle
185
+ ? bundle.getVariant(args.sessionId, args.variantId)
186
+ : JSON.parse(await promises_1.default.readFile(existingManifestPath, 'utf8'));
187
+ if (!prior)
188
+ throw Object.assign(new Error('No published variant'), {
189
+ code: 'ENOENT',
190
+ });
144
191
  preservedCreatedAt = prior.createdAt;
145
192
  preservedRequestId = prior.requestId;
146
193
  // A prior persist may have snapshotted the tree; a later legacy-only
@@ -163,7 +210,7 @@ class VariantHistoryService {
163
210
  }
164
211
  }
165
212
  const sessionPath = path_1.default.join(sessionDir, SESSION_FILENAME);
166
- if (!fs_1.default.existsSync(sessionPath)) {
213
+ if (!bundle && !fs_1.default.existsSync(sessionPath)) {
167
214
  const sessionFile = {
168
215
  schemaVersion: HISTORY_SCHEMA_VERSION,
169
216
  sessionId: args.sessionId,
@@ -233,6 +280,8 @@ class VariantHistoryService {
233
280
  tree = { ref: put.ref, commitSha: put.commitSha, treeSha: put.treeSha };
234
281
  }
235
282
  catch (err) {
283
+ if (bundle)
284
+ throw err;
236
285
  log.warn(`persistVariant: tree snapshot failed for ${args.sessionId}/${args.variantId} — persisting legacy artifacts only`, err);
237
286
  tree = undefined;
238
287
  parent = undefined;
@@ -292,7 +341,9 @@ class VariantHistoryService {
292
341
  designSource: args.designSource,
293
342
  ...(args.runtime ? { runtime: args.runtime } : {}),
294
343
  };
295
- await promises_1.default.writeFile(path_1.default.join(stagingDir, MANIFEST_FILENAME), `${JSON.stringify(manifest, null, 2)}\n`, 'utf8');
344
+ if (!bundle) {
345
+ await promises_1.default.writeFile(path_1.default.join(stagingDir, MANIFEST_FILENAME), `${JSON.stringify(manifest, null, 2)}\n`, 'utf8');
346
+ }
296
347
  if (args.kind === 'diff') {
297
348
  await promises_1.default.writeFile(path_1.default.join(stagingDir, DIFF_FILENAME), args.diff ?? '', 'utf8');
298
349
  }
@@ -303,13 +354,30 @@ class VariantHistoryService {
303
354
  if (args.designMarkdown !== undefined) {
304
355
  await promises_1.default.writeFile(path_1.default.join(stagingDir, DESIGN_FILENAME), args.designMarkdown, 'utf8');
305
356
  }
306
- await promises_1.default.rm(variantDir, { recursive: true, force: true });
307
- await promises_1.default.rename(stagingDir, variantDir);
357
+ if (bundle) {
358
+ for (const pointer of [manifest.tree, manifest.base, manifest.parent]) {
359
+ if (!pointer)
360
+ continue;
361
+ const resolved = await this.treeStore.resolveRef(args.projectPath, pointer.commitSha);
362
+ if (!resolved ||
363
+ ('treeSha' in pointer && pointer.treeSha !== resolved.treeSha)) {
364
+ throw new Error(`Snapshot verification failed: ${pointer.commitSha}`);
365
+ }
366
+ await this.treeStore.retainSnapshot(args.projectPath, pointer.commitSha);
367
+ }
368
+ const publishedDirectory = path_1.default.join(sessionDir, `${args.variantId}-${(0, crypto_1.randomUUID)()}`);
369
+ await promises_1.default.rename(stagingDir, publishedDirectory);
370
+ bundle.upsertVariant(manifest, path_1.default.relative(this.treeStore.storage.resolve(args.projectPath).dataDirectory, publishedDirectory));
371
+ }
372
+ else {
373
+ await promises_1.default.rm(variantDir, { recursive: true, force: true });
374
+ await promises_1.default.rename(stagingDir, variantDir);
375
+ await this.projectManifestToIndex({
376
+ projectPath: args.projectPath,
377
+ manifest,
378
+ });
379
+ }
308
380
  await this.ensureGitignore(args.projectPath);
309
- await this.projectManifestToIndex({
310
- projectPath: args.projectPath,
311
- manifest,
312
- });
313
381
  log.info(`Persisted variant ${args.variantId} (session ${args.sessionId}, kind ${args.kind}, status ${manifest.status})`);
314
382
  }
315
383
  /**
@@ -346,6 +414,16 @@ class VariantHistoryService {
346
414
  async markStatus(args) {
347
415
  assertSafeId(args.sessionId, 'sessionId');
348
416
  assertSafeId(args.variantId, 'variantId');
417
+ const bundle = this.bundleFor(args.projectPath);
418
+ if (bundle) {
419
+ bundle.updateVariant({
420
+ ...args,
421
+ update: (manifest) => {
422
+ applyHistoryStatus(manifest, args);
423
+ },
424
+ });
425
+ return;
426
+ }
349
427
  const manifestPath = path_1.default.join(this.variantDir(args.projectPath, args.sessionId, args.variantId), MANIFEST_FILENAME);
350
428
  let manifest;
351
429
  try {
@@ -362,36 +440,8 @@ class VariantHistoryService {
362
440
  }
363
441
  return;
364
442
  }
365
- // Refuse to downgrade a terminal status. Specifically blocks
366
- // markPersistedVariantsCancelled from rewriting a committed/rejected
367
- // variant as `cancelled` when the session tears down post-commit, and
368
- // prevents stray late-cancels from clobbering a finalized pick.
369
- if (TERMINAL_STATUSES.has(manifest.status) &&
370
- manifest.status !== args.status) {
443
+ if (!applyHistoryStatus(manifest, args))
371
444
  return;
372
- }
373
- const destinationChanged = args.destinationPath !== undefined &&
374
- manifest.destinationPath !== args.destinationPath;
375
- const runnablePathChanged = args.runnablePath !== undefined &&
376
- manifest.preview.kind === 'dev-server' &&
377
- manifest.preview.runnablePath !== args.runnablePath;
378
- if (manifest.status === args.status &&
379
- !destinationChanged &&
380
- !runnablePathChanged)
381
- return;
382
- manifest.status = args.status;
383
- manifest.statusChangedAt = new Date().toISOString();
384
- if (args.destinationPath !== undefined) {
385
- manifest.destinationPath = args.destinationPath;
386
- }
387
- if (args.runnablePath !== undefined) {
388
- if (manifest.artifact.kind === 'project') {
389
- manifest.artifact.runnablePath = args.runnablePath;
390
- }
391
- if (manifest.preview.kind === 'dev-server') {
392
- manifest.preview.runnablePath = args.runnablePath;
393
- }
394
- }
395
445
  await writeManifestFile(manifestPath, manifest);
396
446
  await this.projectManifestToIndex({
397
447
  projectPath: args.projectPath,
@@ -410,6 +460,19 @@ class VariantHistoryService {
410
460
  async renameVariant(args) {
411
461
  assertSafeId(args.sessionId, 'sessionId');
412
462
  assertSafeId(args.variantId, 'variantId');
463
+ const bundle = this.bundleFor(args.projectPath);
464
+ if (bundle) {
465
+ bundle.updateVariant({
466
+ ...args,
467
+ update: (manifest) => {
468
+ if (args.label !== undefined)
469
+ manifest.label = args.label;
470
+ if (args.runLabel !== undefined)
471
+ manifest.runLabel = args.runLabel;
472
+ },
473
+ });
474
+ return;
475
+ }
413
476
  const manifestPath = path_1.default.join(this.variantDir(args.projectPath, args.sessionId, args.variantId), MANIFEST_FILENAME);
414
477
  let manifest;
415
478
  try {
@@ -472,6 +535,21 @@ class VariantHistoryService {
472
535
  assertSafeId(args.sessionId, 'sessionId');
473
536
  assertSafeId(args.variantId, 'variantId');
474
537
  assertSafeId(args.deployment.deployId, 'deployId');
538
+ const bundle = this.bundleFor(args.projectPath);
539
+ if (bundle) {
540
+ const found = bundle.updateVariant({
541
+ ...args,
542
+ update: (manifest) => {
543
+ manifest.deployments = [
544
+ ...(manifest.deployments ?? []),
545
+ args.deployment,
546
+ ];
547
+ },
548
+ });
549
+ if (!found)
550
+ throw new Error(`recordDeployment: no variant for ${args.sessionId}/${args.variantId}`);
551
+ return;
552
+ }
475
553
  const manifestPath = path_1.default.join(this.variantDir(args.projectPath, args.sessionId, args.variantId), MANIFEST_FILENAME);
476
554
  const manifest = await readManifest(manifestPath);
477
555
  if (!manifest) {
@@ -492,6 +570,18 @@ class VariantHistoryService {
492
570
  assertSafeId(variant.variantId, 'variantId');
493
571
  assertSafeId(variant.deployId, 'deployId');
494
572
  }
573
+ const bundle = this.bundleFor(args.projectPath);
574
+ if (bundle) {
575
+ const session = bundle.getSession(args.sessionId);
576
+ if (!session)
577
+ throw new Error(`recordCanvasDeployment: no session for ${args.sessionId}`);
578
+ session.canvasDeployments = [
579
+ ...(session.canvasDeployments ?? []),
580
+ args.deployment,
581
+ ];
582
+ bundle.putSession(session);
583
+ return;
584
+ }
495
585
  const sessionPath = path_1.default.join(this.sessionDir(args.projectPath, args.sessionId), SESSION_FILENAME);
496
586
  let sessionFile;
497
587
  try {
@@ -529,6 +619,21 @@ class VariantHistoryService {
529
619
  return fileExists(path_1.default.join(variantDir, manifest.preview.rootPath, manifest.preview.entryPath));
530
620
  }
531
621
  async listVariants(args) {
622
+ const bundle = this.bundleFor(args.projectPath);
623
+ if (bundle) {
624
+ const matching = bundle
625
+ .listVariants()
626
+ .filter((manifest) => !args.status || manifest.status === args.status);
627
+ const selected = args.limit && args.limit > 0 ? matching.slice(0, args.limit) : matching;
628
+ return Promise.all(selected.map(async (manifest) => {
629
+ const variantDir = this.variantDir(args.projectPath, manifest.sessionId, manifest.variantId);
630
+ return {
631
+ manifest,
632
+ variantDir,
633
+ hasStaticPreview: await this.hasRenderableStaticPreview(args.projectPath, variantDir, manifest),
634
+ };
635
+ }));
636
+ }
532
637
  const root = this.variantsRoot(args.projectPath);
533
638
  if (!fs_1.default.existsSync(root))
534
639
  return [];
@@ -584,6 +689,8 @@ class VariantHistoryService {
584
689
  * project with no history on disk is left untouched.
585
690
  */
586
691
  async listVariantsFromIndex(args) {
692
+ if (this.bundleFor(args.projectPath))
693
+ return this.listVariants(args);
587
694
  if (!fs_1.default.existsSync(this.variantsRoot(args.projectPath)) &&
588
695
  !this.metadataStore.hasDatabase(args.projectPath)) {
589
696
  return [];
@@ -642,7 +749,7 @@ class VariantHistoryService {
642
749
  assertSafeId(args.sessionId, 'sessionId');
643
750
  assertSafeId(args.variantId, 'variantId');
644
751
  const variantDir = this.variantDir(args.projectPath, args.sessionId, args.variantId);
645
- const manifest = await readManifest(path_1.default.join(variantDir, MANIFEST_FILENAME));
752
+ const manifest = await this.readPublishedManifest(args);
646
753
  if (!manifest)
647
754
  return null;
648
755
  const hasStaticPreview = await this.hasRenderableStaticPreview(args.projectPath, variantDir, manifest);
@@ -706,7 +813,7 @@ class VariantHistoryService {
706
813
  assertSafeId(args.sessionId, 'sessionId');
707
814
  assertSafeId(args.variantId, 'variantId');
708
815
  const variantDir = this.variantDir(args.projectPath, args.sessionId, args.variantId);
709
- const manifest = await readManifest(path_1.default.join(variantDir, MANIFEST_FILENAME));
816
+ const manifest = await this.readPublishedManifest(args);
710
817
  if (!manifest)
711
818
  return null;
712
819
  // Tree-backed static entries serve from the content-addressed extraction
@@ -721,7 +828,7 @@ class VariantHistoryService {
721
828
  const cacheDir = await this.treeStore.extractToCache({
722
829
  projectPath: args.projectPath,
723
830
  treeSha: manifest.tree.treeSha,
724
- commitish: manifest.tree.ref,
831
+ commitish: manifest.tree.commitSha,
725
832
  });
726
833
  const fromCache = await readFileWithinRoot(cacheDir, requestedPath);
727
834
  if (fromCache)
@@ -921,4 +1028,38 @@ async function listFilesRecursive(root) {
921
1028
  await walk(root, '');
922
1029
  return out.sort();
923
1030
  }
1031
+ /** Applies status and destination changes while preserving terminal direction states. */
1032
+ const applyHistoryStatus = (manifest, args) => {
1033
+ // Refuse to downgrade a terminal status. Specifically blocks
1034
+ // markPersistedVariantsCancelled from rewriting a committed/rejected
1035
+ // variant as `cancelled` when the session tears down post-commit, and
1036
+ // prevents stray late-cancels from clobbering a finalized pick.
1037
+ if (TERMINAL_STATUSES.has(manifest.status) &&
1038
+ manifest.status !== args.status) {
1039
+ return false;
1040
+ }
1041
+ const destinationChanged = args.destinationPath !== undefined &&
1042
+ manifest.destinationPath !== args.destinationPath;
1043
+ const runnablePathChanged = args.runnablePath !== undefined &&
1044
+ manifest.preview.kind === 'dev-server' &&
1045
+ manifest.preview.runnablePath !== args.runnablePath;
1046
+ if (manifest.status === args.status &&
1047
+ !destinationChanged &&
1048
+ !runnablePathChanged)
1049
+ return false;
1050
+ manifest.status = args.status;
1051
+ manifest.statusChangedAt = new Date().toISOString();
1052
+ if (args.destinationPath !== undefined) {
1053
+ manifest.destinationPath = args.destinationPath;
1054
+ }
1055
+ if (args.runnablePath !== undefined) {
1056
+ if (manifest.artifact.kind === 'project') {
1057
+ manifest.artifact.runnablePath = args.runnablePath;
1058
+ }
1059
+ if (manifest.preview.kind === 'dev-server') {
1060
+ manifest.preview.runnablePath = args.runnablePath;
1061
+ }
1062
+ }
1063
+ return true;
1064
+ };
924
1065
  //# sourceMappingURL=VariantHistoryService.js.map