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
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HubDiscovery = void 0;
4
+ const crypto_1 = require("crypto");
5
+ const zod_1 = require("zod");
6
+ const pid_1 = require("../utils/pid");
7
+ const CoordinatorRecords_1 = require("../storage/library/CoordinatorRecords");
8
+ const HubRecordSchema = zod_1.z.object({
9
+ pid: zod_1.z.number().int().positive(),
10
+ token: zod_1.z.string().uuid(),
11
+ port: zod_1.z.number().int().positive().nullable(),
12
+ });
13
+ /** Coordinates process ownership through one transactional user-level record. */
14
+ class HubDiscovery {
15
+ records;
16
+ constructor(records) {
17
+ this.records = records;
18
+ }
19
+ /** Opens channel-scoped discovery without starting a coordinator. */
20
+ static async open(root) {
21
+ return new HubDiscovery(await CoordinatorRecords_1.CoordinatorRecords.open(root));
22
+ }
23
+ /** Reads the current process identity and its listening port, if ready. */
24
+ read() {
25
+ const row = this.records.read();
26
+ return row ? HubRecordSchema.parse(row) : null;
27
+ }
28
+ /** Elects one live candidate; a dead process cannot retain coordinator ownership. */
29
+ claim() {
30
+ return this.records.transaction(() => {
31
+ const record = this.read();
32
+ if (record && (0, pid_1.isPidAlive)(record.pid))
33
+ return { status: 'occupied', record };
34
+ const token = (0, crypto_1.randomUUID)();
35
+ this.records.assign({ pid: process.pid, token, port: null });
36
+ return { status: 'owned', token };
37
+ });
38
+ }
39
+ /** Publishes readiness only for the process that still owns this coordinator. */
40
+ publish({ token, port }) {
41
+ if (!this.records.publish({ pid: process.pid, token, port }))
42
+ throw new Error('Coordinator ownership changed before startup completed');
43
+ }
44
+ /** Removes only this process's matching ownership record on graceful shutdown. */
45
+ release(token) {
46
+ this.records.release({ pid: process.pid, token });
47
+ }
48
+ /** Clears an unverified record only while its ownership and readiness still match. */
49
+ discard(record) {
50
+ return this.records.discard(record);
51
+ }
52
+ /** Releases the discovery database handle. */
53
+ close() {
54
+ this.records.close();
55
+ }
56
+ }
57
+ exports.HubDiscovery = HubDiscovery;
58
+ //# sourceMappingURL=HubDiscovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HubDiscovery.js","sourceRoot":"","sources":["../../src/services/HubDiscovery.ts"],"names":[],"mappings":";;;AAAA,mCAAoC;AACpC,6BAAwB;AACxB,sCAA0C;AAC1C,8EAA2E;AAE3E,MAAM,eAAe,GAAG,OAAC,CAAC,MAAM,CAAC;IAC/B,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAChC,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IACxB,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;CAC7C,CAAC,CAAC;AAKH,iFAAiF;AACjF,MAAa,YAAY;IACc;IAArC,YAAqC,OAA2B;QAA3B,YAAO,GAAP,OAAO,CAAoB;IAAG,CAAC;IAEpE,qEAAqE;IACrE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAY;QAC5B,OAAO,IAAI,YAAY,CAAC,MAAM,uCAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,2EAA2E;IAC3E,IAAI;QACF,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAChC,OAAO,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjD,CAAC;IAED,qFAAqF;IACrF,KAAK;QACH,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE;YACnC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3B,IAAI,MAAM,IAAI,IAAA,gBAAU,EAAC,MAAM,CAAC,GAAG,CAAC;gBAClC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,IAAA,mBAAU,GAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7D,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,iFAAiF;IACjF,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAmC;QACtD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC9E,CAAC;IAED,kFAAkF;IAClF,OAAO,CAAC,KAAa;QACnB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,sFAAsF;IACtF,OAAO,CAAC,MAAiB;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED,8CAA8C;IAC9C,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF;AA9CD,oCA8CC"}
@@ -0,0 +1,36 @@
1
+ export interface HubNavigationTarget {
2
+ projectId?: string;
3
+ sessionId?: string;
4
+ variantId?: string;
5
+ }
6
+ export interface HubNavigationRequest extends HubNavigationTarget {
7
+ requestId: string;
8
+ }
9
+ export interface HubViewNavigation extends HubNavigationRequest {
10
+ sequence: number;
11
+ }
12
+ interface NavigationResult {
13
+ handled: boolean;
14
+ }
15
+ /** Delivers ordered explicit opens to one browser view without changing other views. */
16
+ export declare class HubNavigation {
17
+ private sequence;
18
+ private readonly views;
19
+ private readonly requests;
20
+ private readonly pendingRequests;
21
+ /** Refreshes browser presence independently of project runtime or preview usage. */
22
+ connect({ viewId, isFocused }: {
23
+ viewId: string;
24
+ isFocused: boolean;
25
+ }): void;
26
+ /** Queues one idempotent navigation and waits for its receiving view to acknowledge it. */
27
+ request(request: HubNavigationRequest): Promise<NavigationResult>;
28
+ /** Returns only this view's ordered navigation queue. */
29
+ pending(viewId: string): HubViewNavigation[];
30
+ /** Accepts acknowledgement only from the receiving view for its pending sequence. */
31
+ acknowledge(viewId: string, sequence: number): boolean;
32
+ /** Releases navigation waiters when the coordinator shuts down. */
33
+ close(): void;
34
+ }
35
+ export {};
36
+ //# sourceMappingURL=HubNavigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HubNavigation.d.ts","sourceRoot":"","sources":["../../src/services/HubNavigation.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AACD,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC/D,SAAS,EAAE,MAAM,CAAC;CACnB;AACD,MAAM,WAAW,iBAAkB,SAAQ,oBAAoB;IAC7D,QAAQ,EAAE,MAAM,CAAC;CAClB;AACD,UAAU,gBAAgB;IACxB,OAAO,EAAE,OAAO,CAAC;CAClB;AAeD,wFAAwF;AACxF,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2B;IACjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgD;IACzE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAwC;IAExE,oFAAoF;IACpF,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAQ5E,2FAA2F;IAC3F,OAAO,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA8BjE,yDAAyD;IACzD,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,EAAE;IAM5C,qFAAqF;IACrF,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAStD,mEAAmE;IACnE,KAAK,IAAI,IAAI;CAOd"}
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HubNavigation = void 0;
4
+ const VIEW_TIMEOUT_MS = 10_000;
5
+ const ACK_TIMEOUT_MS = 2_000;
6
+ const REQUEST_HISTORY_LIMIT = 500;
7
+ /** Delivers ordered explicit opens to one browser view without changing other views. */
8
+ class HubNavigation {
9
+ sequence = 0;
10
+ views = new Map();
11
+ requests = new Map();
12
+ pendingRequests = new Map();
13
+ /** Refreshes browser presence independently of project runtime or preview usage. */
14
+ connect({ viewId, isFocused }) {
15
+ const now = Date.now();
16
+ this.views.set(viewId, {
17
+ lastSeen: now,
18
+ lastFocused: isFocused ? now : (this.views.get(viewId)?.lastFocused ?? 0),
19
+ });
20
+ }
21
+ /** Queues one idempotent navigation and waits for its receiving view to acknowledge it. */
22
+ request(request) {
23
+ const existing = this.requests.get(request.requestId);
24
+ if (existing)
25
+ return existing;
26
+ const now = Date.now();
27
+ const selected = [...this.views.entries()]
28
+ .filter(([, view]) => now - view.lastSeen < VIEW_TIMEOUT_MS)
29
+ .sort((a, b) => b[1].lastFocused - a[1].lastFocused || b[1].lastSeen - a[1].lastSeen)[0];
30
+ if (!selected)
31
+ return Promise.resolve({ handled: false });
32
+ const sequence = ++this.sequence;
33
+ const promise = new Promise((resolve) => {
34
+ const timer = setTimeout(() => {
35
+ this.pendingRequests.delete(sequence);
36
+ resolve({ handled: false });
37
+ }, ACK_TIMEOUT_MS);
38
+ this.pendingRequests.set(sequence, {
39
+ navigation: { ...request, sequence },
40
+ viewId: selected[0],
41
+ finish: resolve,
42
+ timer,
43
+ });
44
+ });
45
+ this.requests.set(request.requestId, promise);
46
+ if (this.requests.size > REQUEST_HISTORY_LIMIT)
47
+ this.requests.delete(this.requests.keys().next().value);
48
+ return promise;
49
+ }
50
+ /** Returns only this view's ordered navigation queue. */
51
+ pending(viewId) {
52
+ return [...this.pendingRequests.values()]
53
+ .filter((request) => request.viewId === viewId)
54
+ .map((request) => request.navigation);
55
+ }
56
+ /** Accepts acknowledgement only from the receiving view for its pending sequence. */
57
+ acknowledge(viewId, sequence) {
58
+ const pending = this.pendingRequests.get(sequence);
59
+ if (!pending || pending.viewId !== viewId)
60
+ return false;
61
+ clearTimeout(pending.timer);
62
+ this.pendingRequests.delete(sequence);
63
+ pending.finish({ handled: true });
64
+ return true;
65
+ }
66
+ /** Releases navigation waiters when the coordinator shuts down. */
67
+ close() {
68
+ for (const pending of this.pendingRequests.values()) {
69
+ clearTimeout(pending.timer);
70
+ pending.finish({ handled: false });
71
+ }
72
+ this.pendingRequests.clear();
73
+ }
74
+ }
75
+ exports.HubNavigation = HubNavigation;
76
+ //# sourceMappingURL=HubNavigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HubNavigation.js","sourceRoot":"","sources":["../../src/services/HubNavigation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { LibraryProjectPreview } from '../types/project-library';
2
+ import type { ProjectLibrary } from './ProjectLibrary';
3
+ import type { ProjectRuntimeService } from './ProjectRuntimeService';
4
+ import type { StaticLibraryPreviews } from './StaticLibraryPreviews';
5
+ import type { TelemetryService } from './TelemetryService';
6
+ /** Supplies cached Original images, or the first saved static direction for fresh projects. */
7
+ export declare class ProjectCardPreviews {
8
+ private readonly services;
9
+ private readonly pending;
10
+ private readonly cache;
11
+ private readonly screenshots;
12
+ constructor(services: {
13
+ library: ProjectLibrary;
14
+ runtime: ProjectRuntimeService;
15
+ previews: StaticLibraryPreviews;
16
+ telemetry?: TelemetryService;
17
+ });
18
+ /** Deduplicates image work by project without activating its runtime or changing preview selection. */
19
+ get(projectId: string): Promise<LibraryProjectPreview | null>;
20
+ /** Releases screenshot processes before the coordinator closes its history stores. */
21
+ close(): Promise<void>;
22
+ /** Reuses valid captures and retains Original images while their working runtime is stopped. */
23
+ private load;
24
+ /** Keeps filesystem provenance in the cache and returns only image presentation data. */
25
+ private publicPreview;
26
+ }
27
+ //# sourceMappingURL=ProjectCardPreviews.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectCardPreviews.d.ts","sourceRoot":"","sources":["../../src/services/ProjectCardPreviews.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAKtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAErE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAK3D,+FAA+F;AAC/F,qBAAa,mBAAmB;IAS5B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAR3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAGpB;IACJ,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsB;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkC;gBAG3C,QAAQ,EAAE;QACzB,OAAO,EAAE,cAAc,CAAC;QACxB,OAAO,EAAE,qBAAqB,CAAC;QAC/B,QAAQ,EAAE,qBAAqB,CAAC;QAChC,SAAS,CAAC,EAAE,gBAAgB,CAAC;KAC9B;IAKH,uGAAuG;IACvG,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC;IAY7D,sFAAsF;IAChF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B,gGAAgG;YAClF,IAAI;IAoElB,yFAAyF;IACzF,OAAO,CAAC,aAAa;CAOtB"}
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProjectCardPreviews = void 0;
4
+ const ProjectPreviewCache_1 = require("../storage/library/ProjectPreviewCache");
5
+ const ProjectScreenshotService_1 = require("./ProjectScreenshotService");
6
+ const logger_1 = require("../utils/logger");
7
+ const log = (0, logger_1.createLogger)('ProjectCardPreviews');
8
+ /** Supplies cached Original images, or the first saved static direction for fresh projects. */
9
+ class ProjectCardPreviews {
10
+ services;
11
+ pending = new Map();
12
+ cache;
13
+ screenshots = new ProjectScreenshotService_1.ProjectScreenshotService();
14
+ constructor(services) {
15
+ this.services = services;
16
+ this.cache = new ProjectPreviewCache_1.ProjectPreviewCache(services.library.registry.root);
17
+ }
18
+ /** Deduplicates image work by project without activating its runtime or changing preview selection. */
19
+ get(projectId) {
20
+ this.services.library.registry.get(projectId);
21
+ const existing = this.pending.get(projectId);
22
+ if (existing)
23
+ return existing;
24
+ const pending = this.load(projectId);
25
+ this.pending.set(projectId, pending);
26
+ void pending
27
+ .finally(() => this.pending.delete(projectId))
28
+ .catch(() => undefined);
29
+ return pending;
30
+ }
31
+ /** Releases screenshot processes before the coordinator closes its history stores. */
32
+ async close() {
33
+ await this.screenshots.close();
34
+ await Promise.allSettled(this.pending.values());
35
+ }
36
+ /** Reuses valid captures and retains Original images while their working runtime is stopped. */
37
+ async load(projectId) {
38
+ const { library, runtime, previews, telemetry } = this.services;
39
+ const project = library.registry.get(projectId);
40
+ let cached = null;
41
+ const startedAt = Date.now();
42
+ try {
43
+ const stored = await this.cache.read(projectId);
44
+ if (stored?.projectPath === project.projectPath)
45
+ cached = stored;
46
+ let url = await runtime.originalPreviewUrl(projectId);
47
+ let sourceKey = 'original';
48
+ let label = 'Original';
49
+ if (!url) {
50
+ if (cached?.sourceKey === 'original')
51
+ return this.publicPreview(cached);
52
+ const first = (await library.listVariants(projectId))
53
+ .filter((entry) => entry.manifest.projectKind === 'fresh' && entry.hasStaticPreview)
54
+ .sort((a, b) => a.manifest.createdAt.localeCompare(b.manifest.createdAt))[0];
55
+ if (!first)
56
+ return null;
57
+ const { manifest } = first;
58
+ sourceKey = JSON.stringify([
59
+ manifest.sessionId,
60
+ manifest.variantId,
61
+ manifest.tree?.treeSha,
62
+ manifest.statusChangedAt,
63
+ ]);
64
+ label = manifest.label;
65
+ if (cached?.sourceKey !== sourceKey)
66
+ cached = null;
67
+ if (cached)
68
+ return { ...this.publicPreview(cached), label };
69
+ url = await previews.url({
70
+ projectId,
71
+ sessionId: manifest.sessionId,
72
+ variantId: manifest.variantId,
73
+ });
74
+ }
75
+ if (cached?.sourceKey === sourceKey)
76
+ return this.publicPreview(cached);
77
+ const preview = {
78
+ sourceKey,
79
+ projectPath: project.projectPath,
80
+ dataUrl: await this.screenshots.capture(url),
81
+ label,
82
+ capturedAt: new Date().toISOString(),
83
+ };
84
+ await this.cache.write(projectId, preview);
85
+ telemetry?.trackLibraryOperation({
86
+ operation: 'thumbnail_capture',
87
+ outcome: 'completed',
88
+ durationMs: Date.now() - startedAt,
89
+ });
90
+ return this.publicPreview(preview);
91
+ }
92
+ catch (error) {
93
+ log.debug('Project image is unavailable; retaining its last capture', error);
94
+ telemetry?.trackLibraryOperation({
95
+ operation: 'thumbnail_capture',
96
+ outcome: 'failed',
97
+ durationMs: Date.now() - startedAt,
98
+ });
99
+ return cached ? this.publicPreview(cached) : null;
100
+ }
101
+ }
102
+ /** Keeps filesystem provenance in the cache and returns only image presentation data. */
103
+ publicPreview(preview) {
104
+ return {
105
+ dataUrl: preview.dataUrl,
106
+ label: preview.label,
107
+ capturedAt: preview.capturedAt,
108
+ };
109
+ }
110
+ }
111
+ exports.ProjectCardPreviews = ProjectCardPreviews;
112
+ //# sourceMappingURL=ProjectCardPreviews.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectCardPreviews.js","sourceRoot":"","sources":["../../src/services/ProjectCardPreviews.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ interface FolderPickerCommand {
2
+ executable: string;
3
+ args: string[];
4
+ cancelExitCode?: number;
5
+ }
6
+ interface FolderPickerOptions {
7
+ commands?: FolderPickerCommand[];
8
+ }
9
+ /** Owns one system folder dialog at a time, independently of project registration. */
10
+ export declare class ProjectFolderPicker {
11
+ private active;
12
+ private readonly commands;
13
+ constructor({ commands }?: FolderPickerOptions);
14
+ /** Opens the host dialog and returns a verified folder, or null when cancelled. */
15
+ pick(): Promise<string | null>;
16
+ /** Dismisses the owned dialog when the coordinator shuts down. */
17
+ close(): void;
18
+ }
19
+ export {};
20
+ //# sourceMappingURL=ProjectFolderPicker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectFolderPicker.d.ts","sourceRoot":"","sources":["../../src/services/ProjectFolderPicker.ts"],"names":[],"mappings":"AAQA,UAAU,mBAAmB;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AACD,UAAU,mBAAmB;IAC3B,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;CAClC;AAwGD,sFAAsF;AACtF,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;gBAErC,EAAE,QAAiC,EAAE,GAAE,mBAAwB;IAI3E,mFAAmF;IAC7E,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAqDpC,kEAAkE;IAClE,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,174 @@
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.ProjectFolderPicker = void 0;
7
+ const child_process_1 = require("child_process");
8
+ const promises_1 = __importDefault(require("fs/promises"));
9
+ const os_1 = __importDefault(require("os"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const util_1 = require("util");
12
+ const libraryErrors_1 = require("./libraryErrors");
13
+ const windowPlacement_1 = require("../utils/windowPlacement");
14
+ const execute = (0, util_1.promisify)(child_process_1.execFile);
15
+ const PICKER_TIMEOUT_MS = 5 * 60 * 1000;
16
+ const PICKER_OUTPUT_LIMIT = 64 * 1024;
17
+ const PICKER_TITLE = 'Open a Rivet project';
18
+ const MAC_FOLDER_SCRIPT = `
19
+ ObjC.import('AppKit');
20
+ const anchor = $.NSEvent.mouseLocation;
21
+ const application = $.NSApplication.sharedApplication;
22
+ application.setActivationPolicy($.NSApplicationActivationPolicyAccessory);
23
+ application.finishLaunching;
24
+ const panel = $.NSOpenPanel.openPanel;
25
+ panel.canChooseFiles = false;
26
+ panel.canChooseDirectories = true;
27
+ panel.allowsMultipleSelection = false;
28
+ panel.title = 'Open a Rivet project';
29
+ panel.prompt = 'Open';
30
+ const screens = $.NSScreen.screens;
31
+ let screen = $.NSScreen.mainScreen;
32
+ for (let index = 0; index < screens.count; index++) {
33
+ const candidate = screens.objectAtIndex(index);
34
+ if ($.NSPointInRect(anchor, candidate.frame)) {
35
+ screen = candidate;
36
+ break;
37
+ }
38
+ }
39
+ const visible = screen.visibleFrame;
40
+ const position = (${windowPlacement_1.getWindowTopLeft.toString()})({
41
+ anchor,
42
+ bounds: {
43
+ x: visible.origin.x,
44
+ y: visible.origin.y,
45
+ width: visible.size.width,
46
+ height: visible.size.height,
47
+ },
48
+ size: {
49
+ width: panel.frame.size.width,
50
+ height: panel.frame.size.height,
51
+ },
52
+ });
53
+ panel.setFrameTopLeftPoint($.NSMakePoint(position.x, position.y));
54
+ application.activateIgnoringOtherApps(true);
55
+ panel.makeKeyAndOrderFront(null);
56
+ panel.runModal === $.NSModalResponseOK ? ObjC.unwrap(panel.URL.path) : '';
57
+ `;
58
+ const WINDOWS_FOLDER_SCRIPT = `
59
+ $ErrorActionPreference = 'Stop'
60
+ [Console]::OutputEncoding = [System.Text.UTF8Encoding]::new($false)
61
+ Add-Type -AssemblyName System.Windows.Forms
62
+ [System.Windows.Forms.Application]::EnableVisualStyles()
63
+ $dialog = [System.Windows.Forms.FolderBrowserDialog]::new()
64
+ $dialog.Description = 'Open a Rivet project'
65
+ try {
66
+ if ($dialog.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) {
67
+ [Console]::Write($dialog.SelectedPath)
68
+ }
69
+ } finally {
70
+ $dialog.Dispose()
71
+ }`;
72
+ /** Selects host folder dialogs without constructing a shell command from user input. */
73
+ const folderPickerCommands = () => {
74
+ switch (process.platform) {
75
+ case 'darwin':
76
+ return [
77
+ {
78
+ executable: '/usr/bin/osascript',
79
+ args: ['-l', 'JavaScript', '-e', MAC_FOLDER_SCRIPT],
80
+ },
81
+ ];
82
+ case 'win32':
83
+ return [
84
+ {
85
+ executable: 'powershell.exe',
86
+ args: [
87
+ '-NoProfile',
88
+ '-NonInteractive',
89
+ '-STA',
90
+ '-Command',
91
+ WINDOWS_FOLDER_SCRIPT,
92
+ ],
93
+ },
94
+ ];
95
+ case 'linux': {
96
+ const zenity = {
97
+ executable: 'zenity',
98
+ args: ['--file-selection', '--directory', '--title', PICKER_TITLE],
99
+ cancelExitCode: 1,
100
+ };
101
+ const kdialog = {
102
+ executable: 'kdialog',
103
+ args: ['--getexistingdirectory', os_1.default.homedir(), '--title', PICKER_TITLE],
104
+ cancelExitCode: 1,
105
+ };
106
+ return process.env.XDG_CURRENT_DESKTOP?.toLowerCase().includes('kde')
107
+ ? [kdialog, zenity]
108
+ : [zenity, kdialog];
109
+ }
110
+ default:
111
+ return [];
112
+ }
113
+ };
114
+ /** Owns one system folder dialog at a time, independently of project registration. */
115
+ class ProjectFolderPicker {
116
+ active = null;
117
+ commands;
118
+ constructor({ commands = folderPickerCommands() } = {}) {
119
+ this.commands = commands;
120
+ }
121
+ /** Opens the host dialog and returns a verified folder, or null when cancelled. */
122
+ async pick() {
123
+ if (this.active)
124
+ throw new libraryErrors_1.LibraryError('folder_picker_busy', 'A folder picker is already open. Choose a folder or cancel it first.');
125
+ const controller = new AbortController();
126
+ this.active = controller;
127
+ try {
128
+ for (const command of this.commands) {
129
+ let output;
130
+ try {
131
+ const result = await execute(command.executable, command.args, {
132
+ encoding: 'utf8',
133
+ windowsHide: true,
134
+ timeout: PICKER_TIMEOUT_MS,
135
+ maxBuffer: PICKER_OUTPUT_LIMIT,
136
+ signal: controller.signal,
137
+ });
138
+ output = result.stdout;
139
+ }
140
+ catch (error) {
141
+ if (controller.signal.aborted)
142
+ return null;
143
+ const failure = error;
144
+ if (failure.code === 'ENOENT')
145
+ continue;
146
+ if (command.cancelExitCode !== undefined &&
147
+ failure.code === command.cancelExitCode &&
148
+ !failure.stderr?.trim())
149
+ return null;
150
+ throw new libraryErrors_1.LibraryError('folder_picker_unavailable', 'Could not open the system folder picker. Try again, or run rivet open --project <path> in a terminal.');
151
+ }
152
+ const selected = output.replace(/\r?\n$/, '');
153
+ if (!selected)
154
+ return null;
155
+ if (!path_1.default.isAbsolute(selected))
156
+ throw new Error('Select an existing folder.');
157
+ const canonical = await promises_1.default.realpath(selected);
158
+ if (!(await promises_1.default.stat(canonical)).isDirectory())
159
+ throw new Error('Select an existing folder.');
160
+ return canonical;
161
+ }
162
+ throw new libraryErrors_1.LibraryError('folder_picker_unavailable', 'No system folder picker is available. On Linux, install Zenity or KDialog, or run rivet open --project <path> in a terminal.');
163
+ }
164
+ finally {
165
+ this.active = null;
166
+ }
167
+ }
168
+ /** Dismisses the owned dialog when the coordinator shuts down. */
169
+ close() {
170
+ this.active?.abort();
171
+ }
172
+ }
173
+ exports.ProjectFolderPicker = ProjectFolderPicker;
174
+ //# sourceMappingURL=ProjectFolderPicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectFolderPicker.js","sourceRoot":"","sources":["../../src/services/ProjectFolderPicker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { ProjectRegistry } from './ProjectRegistry';
2
+ interface ImportOptions {
3
+ registry: ProjectRegistry;
4
+ projectId: string;
5
+ }
6
+ export type ProjectImportResult = {
7
+ status: 'imported' | 'current' | 'deferred' | 'diverged';
8
+ reason?: string;
9
+ };
10
+ /** Copies and verifies a quiescent source before publishing its durable bundle. */
11
+ export declare const importProject: ({ registry, projectId, }: ImportOptions) => Promise<ProjectImportResult>;
12
+ export {};
13
+ //# sourceMappingURL=ProjectImport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectImport.d.ts","sourceRoot":"","sources":["../../src/services/ProjectImport.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AASzD,UAAU,aAAa;IACrB,QAAQ,EAAE,eAAe,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AACD,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAuEF,mFAAmF;AACnF,eAAO,MAAM,aAAa,GAAU,0BAGjC,aAAa,KAAG,OAAO,CAAC,mBAAmB,CAiM7C,CAAC"}