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,317 @@
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.BundleMetadataStore = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const crypto_1 = require("crypto");
9
+ const drizzle_orm_1 = require("drizzle-orm");
10
+ const migrations_1 = require("./migrations");
11
+ const database_1 = require("./database");
12
+ const bundle_1 = require("./schema/bundle");
13
+ const PRESENTATION_KEY = 'variants_ui_state';
14
+ const PROJECT_SINGLETON = 1;
15
+ /** Stable keys preserve request-less grouping and immutable snapshot provenance. */
16
+ const identifier = (value) => (0, crypto_1.createHash)('sha256').update(JSON.stringify(value)).digest('hex');
17
+ /** Owns a bundle's metadata, independently of exported manifests and catalog caches. */
18
+ class BundleMetadataStore {
19
+ db;
20
+ project;
21
+ isClosed = false;
22
+ constructor(db, project) {
23
+ this.db = db;
24
+ this.project = project;
25
+ }
26
+ /** Opens and validates a bundle without repairing or replacing durable user data. */
27
+ static async open({ directory, project, }) {
28
+ const db = await (0, database_1.openDurableDatabase)({
29
+ databasePath: path_1.default.join(directory, 'metadata.sqlite'),
30
+ schema: migrations_1.BUNDLE_SCHEMA,
31
+ });
32
+ try {
33
+ const now = new Date().toISOString();
34
+ db.insert(bundle_1.project)
35
+ .values({
36
+ singleton: PROJECT_SINGLETON,
37
+ id: project.id,
38
+ name: project.name,
39
+ createdAt: now,
40
+ updatedAt: now,
41
+ })
42
+ .onConflictDoNothing()
43
+ .run();
44
+ if (db.select({ id: bundle_1.project.id }).from(bundle_1.project).get()?.id !== project.id)
45
+ throw new Error('Bundle project identity does not match registration');
46
+ return new BundleMetadataStore(db, project);
47
+ }
48
+ catch (error) {
49
+ (0, database_1.closeDatabase)(db);
50
+ throw error;
51
+ }
52
+ }
53
+ /** Publishes verified artifact metadata and increments its revision in one transaction. */
54
+ upsertVariant(manifest, artifactPath) {
55
+ (0, database_1.transaction)(this.db, () => this.writeVariant(manifest, artifactPath));
56
+ }
57
+ /** Applies a metadata edit while holding the database write transaction. */
58
+ updateVariant(args) {
59
+ return (0, database_1.transaction)(this.db, () => {
60
+ const manifest = this.getVariant(args.sessionId, args.variantId);
61
+ if (!manifest)
62
+ return false;
63
+ const before = JSON.stringify(manifest);
64
+ args.update(manifest);
65
+ if (JSON.stringify(manifest) !== before)
66
+ this.writeVariant(manifest);
67
+ return true;
68
+ });
69
+ }
70
+ /** Reads the relative artifact directory published with a direction. */
71
+ artifactPath(sessionId, variantId) {
72
+ return (this.db
73
+ .select({ path: bundle_1.variants.artifactPath })
74
+ .from(bundle_1.variants)
75
+ .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(bundle_1.variants.sessionId, sessionId), (0, drizzle_orm_1.eq)(bundle_1.variants.variantId, variantId)))
76
+ .get()?.path ?? null);
77
+ }
78
+ /** Writes metadata within the caller's transaction after artifact verification. */
79
+ writeVariant(manifest, artifactPath) {
80
+ const { sessionId, variantId, label, brief, status, createdAt, statusChangedAt, changedFilesCount, tree, base, parent, parentVariant, ...details } = manifest;
81
+ this.db
82
+ .insert(bundle_1.sessions)
83
+ .values({
84
+ id: sessionId,
85
+ initialPrompt: manifest.sessionPrompt,
86
+ projectKind: manifest.projectKind,
87
+ sourceWorkspaceId: this.project.workspaceId,
88
+ createdAt,
89
+ details: {},
90
+ })
91
+ .onConflictDoNothing()
92
+ .run();
93
+ const existing = this.db
94
+ .select({ batchId: bundle_1.variants.batchId })
95
+ .from(bundle_1.variants)
96
+ .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(bundle_1.variants.sessionId, sessionId), (0, drizzle_orm_1.eq)(bundle_1.variants.variantId, variantId)))
97
+ .get();
98
+ const batchId = existing?.batchId ??
99
+ identifier([
100
+ sessionId,
101
+ manifest.requestId ?? null,
102
+ manifest.requestId ? null : (manifest.runLabel ?? null),
103
+ ]);
104
+ const batchLabel = manifest.runLabel ?? null;
105
+ this.db
106
+ .insert(bundle_1.batches)
107
+ .values({
108
+ id: batchId,
109
+ sessionId,
110
+ requestId: manifest.requestId ?? null,
111
+ label: batchLabel,
112
+ createdAt,
113
+ })
114
+ .onConflictDoUpdate({
115
+ target: [bundle_1.batches.sessionId, bundle_1.batches.id],
116
+ set: { label: batchLabel },
117
+ })
118
+ .run();
119
+ const metadata = {
120
+ batchId,
121
+ label,
122
+ brief,
123
+ status,
124
+ statusChangedAt,
125
+ changedFilesCount,
126
+ details,
127
+ snapshotId: this.putSnapshot(tree, createdAt),
128
+ baseSnapshotId: this.putSnapshot(base, createdAt),
129
+ parentSnapshotId: this.putSnapshot(parent, createdAt),
130
+ parentSessionId: parentVariant?.sessionId ?? null,
131
+ parentVariantId: parentVariant?.variantId ?? null,
132
+ };
133
+ this.db
134
+ .insert(bundle_1.variants)
135
+ .values({
136
+ sessionId,
137
+ variantId,
138
+ createdAt,
139
+ artifactPath: artifactPath ?? null,
140
+ ...metadata,
141
+ })
142
+ .onConflictDoUpdate({
143
+ target: [bundle_1.variants.sessionId, bundle_1.variants.variantId],
144
+ set: {
145
+ ...metadata,
146
+ ...(artifactPath !== undefined ? { artifactPath } : {}),
147
+ },
148
+ })
149
+ .run();
150
+ }
151
+ /** Reads one exact direction; missing identifiers never fall back to another session. */
152
+ getVariant(sessionId, variantId) {
153
+ const row = this.db
154
+ .select()
155
+ .from(bundle_1.variants)
156
+ .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(bundle_1.variants.sessionId, sessionId), (0, drizzle_orm_1.eq)(bundle_1.variants.variantId, variantId)))
157
+ .get();
158
+ return row ? this.decodeVariant(row) : null;
159
+ }
160
+ /** Lists published metadata in stable creation order without reading artifact files. */
161
+ listVariants() {
162
+ return this.db
163
+ .select()
164
+ .from(bundle_1.variants)
165
+ .orderBy((0, drizzle_orm_1.desc)(bundle_1.variants.createdAt), bundle_1.variants.sessionId, bundle_1.variants.variantId)
166
+ .all()
167
+ .map((row) => this.decodeVariant(row));
168
+ }
169
+ /** Preserves session-level metadata such as whole-canvas deployments. */
170
+ putSession(session) {
171
+ (0, database_1.transaction)(this.db, () => {
172
+ this.db
173
+ .insert(bundle_1.sessions)
174
+ .values({
175
+ id: session.sessionId,
176
+ initialPrompt: session.sessionPrompt,
177
+ projectKind: session.projectKind,
178
+ sourceWorkspaceId: this.project.workspaceId,
179
+ createdAt: session.createdAt,
180
+ details: session,
181
+ })
182
+ .onConflictDoUpdate({ target: bundle_1.sessions.id, set: { details: session } })
183
+ .run();
184
+ });
185
+ }
186
+ /** Reads stored session metadata, including imported extension fields. */
187
+ getSession(sessionId) {
188
+ const row = this.db
189
+ .select()
190
+ .from(bundle_1.sessions)
191
+ .where((0, drizzle_orm_1.eq)(bundle_1.sessions.id, sessionId))
192
+ .get();
193
+ if (!row)
194
+ return null;
195
+ return {
196
+ schemaVersion: 2,
197
+ sessionId,
198
+ sessionPrompt: row.initialPrompt,
199
+ projectKind: row.projectKind,
200
+ createdAt: row.createdAt,
201
+ ...row.details,
202
+ };
203
+ }
204
+ /** Stores the editor's pins and ordering without involving a derived catalog. */
205
+ setPresentation(value) {
206
+ (0, database_1.transaction)(this.db, () => {
207
+ const updatedAt = new Date().toISOString();
208
+ const serializedValue = JSON.stringify(value);
209
+ this.db
210
+ .insert(bundle_1.presentation)
211
+ .values({ key: PRESENTATION_KEY, value: serializedValue, updatedAt })
212
+ .onConflictDoUpdate({
213
+ target: bundle_1.presentation.key,
214
+ set: { value: serializedValue, updatedAt },
215
+ })
216
+ .run();
217
+ });
218
+ }
219
+ /** Returns the stored presentation document or null before the first edit. */
220
+ getPresentation() {
221
+ const row = this.db
222
+ .select({ value: bundle_1.presentation.value })
223
+ .from(bundle_1.presentation)
224
+ .where((0, drizzle_orm_1.eq)(bundle_1.presentation.key, PRESENTATION_KEY))
225
+ .get();
226
+ return row ? JSON.parse(row.value) : null;
227
+ }
228
+ /** Releases the bundle database handle. */
229
+ close() {
230
+ if (!this.isClosed) {
231
+ (0, database_1.closeDatabase)(this.db);
232
+ this.isClosed = true;
233
+ }
234
+ }
235
+ /** Records an immutable ref/commit pair, separately from mutable ref names. */
236
+ putSnapshot(pointer, createdAt) {
237
+ if (!pointer)
238
+ return null;
239
+ const id = identifier([pointer.ref, pointer.commitSha]);
240
+ this.db
241
+ .insert(bundle_1.snapshots)
242
+ .values({
243
+ id,
244
+ gitRef: pointer.ref,
245
+ commitSha: pointer.commitSha,
246
+ treeSha: pointer.treeSha ?? null,
247
+ createdAt,
248
+ })
249
+ .onConflictDoUpdate({
250
+ target: bundle_1.snapshots.id,
251
+ set: {
252
+ treeSha: (0, drizzle_orm_1.sql) `coalesce(${bundle_1.snapshots.treeSha}, ${pointer.treeSha ?? null})`,
253
+ },
254
+ })
255
+ .run();
256
+ return id;
257
+ }
258
+ /** Reconstructs a saved pointer from its durable provenance record. */
259
+ snapshot(id) {
260
+ if (id === null)
261
+ return undefined;
262
+ const row = this.db
263
+ .select()
264
+ .from(bundle_1.snapshots)
265
+ .where((0, drizzle_orm_1.eq)(bundle_1.snapshots.id, id))
266
+ .get();
267
+ if (!row)
268
+ throw new Error('Missing snapshot metadata');
269
+ return {
270
+ ref: row.gitRef,
271
+ commitSha: row.commitSha,
272
+ ...(row.treeSha ? { treeSha: row.treeSha } : {}),
273
+ };
274
+ }
275
+ /** Reconstructs the history contract from scalar records and extension metadata. */
276
+ decodeVariant(row) {
277
+ const tree = this.snapshot(row.snapshotId);
278
+ const base = this.snapshot(row.baseSnapshotId);
279
+ const parent = this.snapshot(row.parentSnapshotId);
280
+ if (tree && !tree.treeSha)
281
+ throw new Error('Missing snapshot tree metadata');
282
+ return {
283
+ ...row.details,
284
+ sessionId: row.sessionId,
285
+ variantId: row.variantId,
286
+ label: row.label,
287
+ brief: row.brief,
288
+ status: row.status,
289
+ createdAt: row.createdAt,
290
+ statusChangedAt: row.statusChangedAt,
291
+ changedFilesCount: row.changedFilesCount,
292
+ ...(tree?.treeSha
293
+ ? {
294
+ tree: {
295
+ ref: tree.ref,
296
+ commitSha: tree.commitSha,
297
+ treeSha: tree.treeSha,
298
+ },
299
+ }
300
+ : {}),
301
+ ...(base ? { base: { ref: base.ref, commitSha: base.commitSha } } : {}),
302
+ ...(parent
303
+ ? { parent: { ref: parent.ref, commitSha: parent.commitSha } }
304
+ : {}),
305
+ ...(row.parentVariantId && row.parentSessionId
306
+ ? {
307
+ parentVariant: {
308
+ sessionId: row.parentSessionId,
309
+ variantId: row.parentVariantId,
310
+ },
311
+ }
312
+ : {}),
313
+ };
314
+ }
315
+ }
316
+ exports.BundleMetadataStore = BundleMetadataStore;
317
+ //# sourceMappingURL=BundleMetadataStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BundleMetadataStore.js","sourceRoot":"","sources":["../../../src/storage/library/BundleMetadataStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { coordinator } from './schema/coordinator';
2
+ type CoordinatorRecord = Pick<typeof coordinator.$inferSelect, 'pid' | 'token' | 'port'>;
3
+ /** Persists coordinator ownership and readiness in the channel's runtime directory. */
4
+ export declare class CoordinatorRecords {
5
+ private readonly db;
6
+ private constructor();
7
+ /** Opens the durable coordinator record. */
8
+ static open(root: string): Promise<CoordinatorRecords>;
9
+ /** Holds the write lock while a caller checks and assigns process ownership. */
10
+ transaction<T>(operation: () => T): T;
11
+ /** Reads the recorded owner and its published port. */
12
+ read(): CoordinatorRecord | null;
13
+ /** Replaces the owner within the caller's ownership transaction. */
14
+ assign(record: CoordinatorRecord): void;
15
+ /** Updates readiness only while the supplied process still owns the record. */
16
+ publish({ pid, token, port }: CoordinatorRecord): boolean;
17
+ /** Deletes only the supplied process identity. */
18
+ release({ pid, token }: Omit<CoordinatorRecord, 'port'>): void;
19
+ /** Deletes an observed record only if neither its owner nor readiness has changed. */
20
+ discard({ pid, token, port }: CoordinatorRecord): boolean;
21
+ /** Releases the discovery database connection. */
22
+ close(): void;
23
+ }
24
+ export {};
25
+ //# sourceMappingURL=CoordinatorRecords.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CoordinatorRecords.d.ts","sourceRoot":"","sources":["../../../src/storage/library/CoordinatorRecords.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGnD,KAAK,iBAAiB,GAAG,IAAI,CAC3B,OAAO,WAAW,CAAC,YAAY,EAC/B,KAAK,GAAG,OAAO,GAAG,MAAM,CACzB,CAAC;AAGF,uFAAuF;AACvF,qBAAa,kBAAkB;IACT,OAAO,CAAC,QAAQ,CAAC,EAAE;IAAvC,OAAO;IAEP,4CAA4C;WAC/B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAS5D,gFAAgF;IAChF,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC;IAIrC,uDAAuD;IACvD,IAAI,IAAI,iBAAiB,GAAG,IAAI;IAchC,oEAAoE;IACpE,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAQvC,+EAA+E;IAC/E,OAAO,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,iBAAiB,GAAG,OAAO;IAkBzD,kDAAkD;IAClD,OAAO,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,GAAG,IAAI;IAS9D,sFAAsF;IACtF,OAAO,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,iBAAiB,GAAG,OAAO;IAkBzD,kDAAkD;IAClD,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,84 @@
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.CoordinatorRecords = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const drizzle_orm_1 = require("drizzle-orm");
9
+ const database_1 = require("./database");
10
+ const migrations_1 = require("./migrations");
11
+ const coordinator_1 = require("./schema/coordinator");
12
+ const COORDINATOR_SINGLETON = 1;
13
+ /** Persists coordinator ownership and readiness in the channel's runtime directory. */
14
+ class CoordinatorRecords {
15
+ db;
16
+ constructor(db) {
17
+ this.db = db;
18
+ }
19
+ /** Opens the durable coordinator record. */
20
+ static async open(root) {
21
+ return new CoordinatorRecords(await (0, database_1.openDurableDatabase)({
22
+ databasePath: path_1.default.join(root, 'runtime', 'coordinator.sqlite'),
23
+ schema: migrations_1.COORDINATOR_SCHEMA,
24
+ }));
25
+ }
26
+ /** Holds the write lock while a caller checks and assigns process ownership. */
27
+ transaction(operation) {
28
+ return (0, database_1.transaction)(this.db, operation);
29
+ }
30
+ /** Reads the recorded owner and its published port. */
31
+ read() {
32
+ return (this.db
33
+ .select({
34
+ pid: coordinator_1.coordinator.pid,
35
+ token: coordinator_1.coordinator.token,
36
+ port: coordinator_1.coordinator.port,
37
+ })
38
+ .from(coordinator_1.coordinator)
39
+ .where((0, drizzle_orm_1.eq)(coordinator_1.coordinator.singleton, COORDINATOR_SINGLETON))
40
+ .get() ?? null);
41
+ }
42
+ /** Replaces the owner within the caller's ownership transaction. */
43
+ assign(record) {
44
+ this.db
45
+ .insert(coordinator_1.coordinator)
46
+ .values({ singleton: COORDINATOR_SINGLETON, ...record })
47
+ .onConflictDoUpdate({ target: coordinator_1.coordinator.singleton, set: record })
48
+ .run();
49
+ }
50
+ /** Updates readiness only while the supplied process still owns the record. */
51
+ publish({ pid, token, port }) {
52
+ return this.transaction(() => {
53
+ return (this.db
54
+ .update(coordinator_1.coordinator)
55
+ .set({ port })
56
+ .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(coordinator_1.coordinator.singleton, COORDINATOR_SINGLETON), (0, drizzle_orm_1.eq)(coordinator_1.coordinator.pid, pid), (0, drizzle_orm_1.eq)(coordinator_1.coordinator.token, token)))
57
+ .run().changes === 1);
58
+ });
59
+ }
60
+ /** Deletes only the supplied process identity. */
61
+ release({ pid, token }) {
62
+ this.transaction(() => {
63
+ this.db
64
+ .delete(coordinator_1.coordinator)
65
+ .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(coordinator_1.coordinator.pid, pid), (0, drizzle_orm_1.eq)(coordinator_1.coordinator.token, token)))
66
+ .run();
67
+ });
68
+ }
69
+ /** Deletes an observed record only if neither its owner nor readiness has changed. */
70
+ discard({ pid, token, port }) {
71
+ return (this.db
72
+ .delete(coordinator_1.coordinator)
73
+ .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(coordinator_1.coordinator.singleton, COORDINATOR_SINGLETON), (0, drizzle_orm_1.eq)(coordinator_1.coordinator.pid, pid), (0, drizzle_orm_1.eq)(coordinator_1.coordinator.token, token), port === null
74
+ ? (0, drizzle_orm_1.isNull)(coordinator_1.coordinator.port)
75
+ : (0, drizzle_orm_1.eq)(coordinator_1.coordinator.port, port)))
76
+ .run().changes === 1);
77
+ }
78
+ /** Releases the discovery database connection. */
79
+ close() {
80
+ (0, database_1.closeDatabase)(this.db);
81
+ }
82
+ }
83
+ exports.CoordinatorRecords = CoordinatorRecords;
84
+ //# sourceMappingURL=CoordinatorRecords.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CoordinatorRecords.js","sourceRoot":"","sources":["../../../src/storage/library/CoordinatorRecords.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { z } from 'zod';
2
+ declare const PreviewSchema: z.ZodObject<{
3
+ sourceKey: z.ZodString;
4
+ projectPath: z.ZodString;
5
+ dataUrl: z.ZodString;
6
+ label: z.ZodString;
7
+ capturedAt: z.ZodString;
8
+ }, "strip", z.ZodTypeAny, {
9
+ label: string;
10
+ dataUrl: string;
11
+ projectPath: string;
12
+ sourceKey: string;
13
+ capturedAt: string;
14
+ }, {
15
+ label: string;
16
+ dataUrl: string;
17
+ projectPath: string;
18
+ sourceKey: string;
19
+ capturedAt: string;
20
+ }>;
21
+ export type CachedProjectPreview = z.infer<typeof PreviewSchema>;
22
+ /** Persists disposable project images outside authoritative bundles and metadata. */
23
+ export declare class ProjectPreviewCache {
24
+ private readonly root;
25
+ constructor(root: string);
26
+ /** Reads a validated cache entry; missing or malformed images can be regenerated. */
27
+ read(projectId: string): Promise<CachedProjectPreview | null>;
28
+ /** Atomically replaces one private image without exposing partially written bytes. */
29
+ write(projectId: string, preview: CachedProjectPreview): Promise<void>;
30
+ /** Restricts cache filenames to registered project identifiers. */
31
+ private file;
32
+ }
33
+ export {};
34
+ //# sourceMappingURL=ProjectPreviewCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectPreviewCache.d.ts","sourceRoot":"","sources":["../../../src/storage/library/ProjectPreviewCache.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,aAAa;;;;;;;;;;;;;;;;;;EAMjB,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAIjE,qFAAqF;AACrF,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,MAAM;IAEzC,qFAAqF;IAC/E,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAiBnE,sFAAsF;IAChF,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB5E,mEAAmE;IACnE,OAAO,CAAC,IAAI;CAQb"}
@@ -0,0 +1,62 @@
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.ProjectPreviewCache = void 0;
7
+ const promises_1 = __importDefault(require("fs/promises"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const crypto_1 = require("crypto");
10
+ const zod_1 = require("zod");
11
+ const PreviewSchema = zod_1.z.object({
12
+ sourceKey: zod_1.z.string(),
13
+ projectPath: zod_1.z.string(),
14
+ dataUrl: zod_1.z.string().startsWith('data:image/jpeg;base64,'),
15
+ label: zod_1.z.string(),
16
+ capturedAt: zod_1.z.string().datetime(),
17
+ });
18
+ const OWNER_ONLY_DIRECTORY = 0o700;
19
+ const OWNER_ONLY_FILE = 0o600;
20
+ /** Persists disposable project images outside authoritative bundles and metadata. */
21
+ class ProjectPreviewCache {
22
+ root;
23
+ constructor(root) {
24
+ this.root = root;
25
+ }
26
+ /** Reads a validated cache entry; missing or malformed images can be regenerated. */
27
+ async read(projectId) {
28
+ try {
29
+ const raw = JSON.parse(await promises_1.default.readFile(this.file(projectId), 'utf8'));
30
+ const result = PreviewSchema.safeParse(raw);
31
+ return result.success ? result.data : null;
32
+ }
33
+ catch (error) {
34
+ if (error instanceof SyntaxError ||
35
+ error.code === 'ENOENT')
36
+ return null;
37
+ throw error;
38
+ }
39
+ }
40
+ /** Atomically replaces one private image without exposing partially written bytes. */
41
+ async write(projectId, preview) {
42
+ const target = this.file(projectId);
43
+ await promises_1.default.mkdir(path_1.default.dirname(target), {
44
+ recursive: true,
45
+ mode: OWNER_ONLY_DIRECTORY,
46
+ });
47
+ const temporary = `${target}.${(0, crypto_1.randomUUID)()}.tmp`;
48
+ try {
49
+ await promises_1.default.writeFile(temporary, JSON.stringify(PreviewSchema.parse(preview)), { mode: OWNER_ONLY_FILE });
50
+ await promises_1.default.rename(temporary, target);
51
+ }
52
+ finally {
53
+ await promises_1.default.rm(temporary, { force: true });
54
+ }
55
+ }
56
+ /** Restricts cache filenames to registered project identifiers. */
57
+ file(projectId) {
58
+ return path_1.default.join(this.root, 'cache', zod_1.z.string().uuid().parse(projectId), 'project-preview.json');
59
+ }
60
+ }
61
+ exports.ProjectPreviewCache = ProjectPreviewCache;
62
+ //# sourceMappingURL=ProjectPreviewCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectPreviewCache.js","sourceRoot":"","sources":["../../../src/storage/library/ProjectPreviewCache.ts"],"names":[],"mappings":";;;;;;AAAA,2DAA6B;AAC7B,gDAAwB;AACxB,mCAAoC;AACpC,6BAAwB;AAExB,MAAM,aAAa,GAAG,OAAC,CAAC,MAAM,CAAC;IAC7B,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE;IACrB,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE;IACvB,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,yBAAyB,CAAC;IACzD,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE;IACjB,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC;AAEH,MAAM,oBAAoB,GAAG,KAAK,CAAC;AACnC,MAAM,eAAe,GAAG,KAAK,CAAC;AAE9B,qFAAqF;AACrF,MAAa,mBAAmB;IACD;IAA7B,YAA6B,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;IAE7C,qFAAqF;IACrF,KAAK,CAAC,IAAI,CAAC,SAAiB;QAC1B,IAAI,CAAC;YACH,MAAM,GAAG,GAAY,IAAI,CAAC,KAAK,CAC7B,MAAM,kBAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAChD,CAAC;YACF,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC5C,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IACE,KAAK,YAAY,WAAW;gBAC3B,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAElD,OAAO,IAAI,CAAC;YACd,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,sFAAsF;IACtF,KAAK,CAAC,KAAK,CAAC,SAAiB,EAAE,OAA6B;QAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACpC,MAAM,kBAAE,CAAC,KAAK,CAAC,cAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACnC,SAAS,EAAE,IAAI;YACf,IAAI,EAAE,oBAAoB;SAC3B,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,GAAG,MAAM,IAAI,IAAA,mBAAU,GAAE,MAAM,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,kBAAE,CAAC,SAAS,CAChB,SAAS,EACT,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAC5C,EAAE,IAAI,EAAE,eAAe,EAAE,CAC1B,CAAC;YACF,MAAM,kBAAE,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACrC,CAAC;gBAAS,CAAC;YACT,MAAM,kBAAE,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,mEAAmE;IAC3D,IAAI,CAAC,SAAiB;QAC5B,OAAO,cAAI,CAAC,IAAI,CACd,IAAI,CAAC,IAAI,EACT,OAAO,EACP,OAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,EAClC,sBAAsB,CACvB,CAAC;IACJ,CAAC;CACF;AAlDD,kDAkDC"}
@@ -0,0 +1,64 @@
1
+ export type ProjectRecord = ReturnType<ProjectRecords['list']>[number];
2
+ /** Persists project identities and their machine-specific workspace attachments. */
3
+ export declare class ProjectRecords {
4
+ private readonly db;
5
+ private constructor();
6
+ /** Opens the registry with its durable schema and write coordination. */
7
+ static open(root: string): Promise<ProjectRecords>;
8
+ /** Runs related reads and writes under one immediate transaction. */
9
+ transaction<T>(operation: () => T): T;
10
+ /** Lists persisted attachments in stable last-opened order. */
11
+ list(): {
12
+ id: string;
13
+ workspaceId: string;
14
+ name: string;
15
+ projectPath: string;
16
+ createdAt: string;
17
+ lastOpenedAt: string;
18
+ storageKind: "project" | "bundle";
19
+ sourceFingerprint: string | null;
20
+ }[];
21
+ /** Reads a single project and its workspace attachment. */
22
+ get(projectId: string): {
23
+ id: string;
24
+ workspaceId: string;
25
+ name: string;
26
+ projectPath: string;
27
+ createdAt: string;
28
+ lastOpenedAt: string;
29
+ storageKind: "project" | "bundle";
30
+ sourceFingerprint: string | null;
31
+ } | null;
32
+ /** Finds the owner of a canonical workspace or attributed history root. */
33
+ findByPath(canonicalPath: string): {
34
+ id: string;
35
+ workspaceId: string;
36
+ name: string;
37
+ projectPath: string;
38
+ createdAt: string;
39
+ lastOpenedAt: string;
40
+ storageKind: "project" | "bundle";
41
+ sourceFingerprint: string | null;
42
+ } | null;
43
+ /** Inserts a project and its workspace within the caller's transaction. */
44
+ insert(record: {
45
+ id: string;
46
+ name: string;
47
+ workspaceId: string;
48
+ canonicalPath: string;
49
+ createdAt: string;
50
+ }): void;
51
+ /** Records the time a registered project was opened. */
52
+ recordOpening(projectId: string, lastOpenedAt: string): void;
53
+ /** Records one explicitly attributed generated history directory. */
54
+ attachHistoryRoot(projectId: string, canonicalPath: string): void;
55
+ /** Lists the persisted generated history attachments for a project. */
56
+ historyRoots(projectId: string): string[];
57
+ /** Updates a workspace attachment without changing either identity. */
58
+ relink(projectId: string, canonicalPath: string): void;
59
+ /** Publishes the authoritative storage owner and its verified source fingerprint. */
60
+ activateBundle(projectId: string, sourceFingerprint: string | null): void;
61
+ /** Releases the registry connection. */
62
+ close(): void;
63
+ }
64
+ //# sourceMappingURL=ProjectRecords.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectRecords.d.ts","sourceRoot":"","sources":["../../../src/storage/library/ProjectRecords.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvE,oFAAoF;AACpF,qBAAa,cAAc;IACL,OAAO,CAAC,QAAQ,CAAC,EAAE;IAAvC,OAAO;IAEP,yEAAyE;WAC5D,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IASxD,qEAAqE;IACrE,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC;IAIrC,+DAA+D;IAC/D,IAAI;;;;;;;;;;IASJ,2DAA2D;IAC3D,GAAG,CAAC,SAAS,EAAE,MAAM;;;;;;;;;;IAWrB,2EAA2E;IAC3E,UAAU,CAAC,aAAa,EAAE,MAAM;;;;;;;;;;IAoBhC,2EAA2E;IAC3E,MAAM,CAAC,MAAM,EAAE;QACb,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,IAAI;IAoBR,wDAAwD;IACxD,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAQ5D,qEAAqE;IACrE,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAQjE,uEAAuE;IACvE,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IASzC,uEAAuE;IACvE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAQtD,qFAAqF;IACrF,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAUzE,wCAAwC;IACxC,KAAK,IAAI,IAAI;CAGd"}