rivet-design 0.16.2 → 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.
- package/README.md +8 -2
- package/README.npm.md +8 -2
- package/bin/rivet.js +15 -7
- package/dist/agent-variants/variantContext.d.ts +1 -0
- package/dist/agent-variants/variantContext.d.ts.map +1 -1
- package/dist/agent-variants/variantContext.js +1 -1
- package/dist/agent-variants/variantContext.js.map +1 -1
- package/dist/cli/commandNames.d.ts +2 -0
- package/dist/cli/commandNames.d.ts.map +1 -1
- package/dist/cli/commandNames.js +16 -1
- package/dist/cli/commandNames.js.map +1 -1
- package/dist/cli/commands/libraryOpen.d.ts +10 -0
- package/dist/cli/commands/libraryOpen.d.ts.map +1 -0
- package/dist/cli/commands/libraryOpen.js +126 -0
- package/dist/cli/commands/libraryOpen.js.map +1 -0
- package/dist/cli/commands/open.d.ts +39 -0
- package/dist/cli/commands/open.d.ts.map +1 -1
- package/dist/cli/commands/open.js +35 -21
- package/dist/cli/commands/open.js.map +1 -1
- package/dist/cli/commands/serve.d.ts.map +1 -1
- package/dist/cli/commands/serve.js +33 -0
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/router.d.ts.map +1 -1
- package/dist/cli/router.js +34 -3
- package/dist/cli/router.js.map +1 -1
- package/dist/cli/serverHandshake.d.ts +7 -5
- package/dist/cli/serverHandshake.d.ts.map +1 -1
- package/dist/cli/serverHandshake.js +16 -12
- package/dist/cli/serverHandshake.js.map +1 -1
- package/dist/install/installationChannel.d.ts +4 -0
- package/dist/install/installationChannel.d.ts.map +1 -0
- package/dist/install/installationChannel.js +13 -0
- package/dist/install/installationChannel.js.map +1 -0
- package/dist/library/HubClient.d.ts +12 -0
- package/dist/library/HubClient.d.ts.map +1 -0
- package/dist/library/HubClient.js +109 -0
- package/dist/library/HubClient.js.map +1 -0
- package/dist/library/HubServer.d.ts +16 -0
- package/dist/library/HubServer.d.ts.map +1 -0
- package/dist/library/HubServer.js +95 -0
- package/dist/library/HubServer.js.map +1 -0
- package/dist/library/StaticPreviewServer.d.ts +7 -0
- package/dist/library/StaticPreviewServer.d.ts.map +1 -0
- package/dist/library/StaticPreviewServer.js +18 -0
- package/dist/library/StaticPreviewServer.js.map +1 -0
- package/dist/library/http.d.ts +11 -0
- package/dist/library/http.d.ts.map +1 -0
- package/dist/library/http.js +31 -0
- package/dist/library/http.js.map +1 -0
- package/dist/library/importFiles.d.ts +18 -0
- package/dist/library/importFiles.d.ts.map +1 -0
- package/dist/library/importFiles.js +184 -0
- package/dist/library/importFiles.js.map +1 -0
- package/dist/proxy-middleware/preview-bridge.d.ts.map +1 -1
- package/dist/proxy-middleware/preview-bridge.js +6 -16
- package/dist/proxy-middleware/preview-bridge.js.map +1 -1
- package/dist/routes/account.d.ts +4 -0
- package/dist/routes/account.d.ts.map +1 -0
- package/dist/routes/account.js +53 -0
- package/dist/routes/account.js.map +1 -0
- package/dist/routes/agentVariants.d.ts +2 -13
- package/dist/routes/agentVariants.d.ts.map +1 -1
- package/dist/routes/agentVariants.js +53 -79
- package/dist/routes/agentVariants.js.map +1 -1
- package/dist/routes/library/app.d.ts +8 -0
- package/dist/routes/library/app.d.ts.map +1 -0
- package/dist/routes/library/app.js +26 -0
- package/dist/routes/library/app.js.map +1 -0
- package/dist/routes/library/index.d.ts +5 -0
- package/dist/routes/library/index.d.ts.map +1 -0
- package/dist/routes/library/index.js +32 -0
- package/dist/routes/library/index.js.map +1 -0
- package/dist/routes/library/middleware.d.ts +9 -0
- package/dist/routes/library/middleware.d.ts.map +1 -0
- package/dist/routes/library/middleware.js +58 -0
- package/dist/routes/library/middleware.js.map +1 -0
- package/dist/routes/library/navigation.d.ts +5 -0
- package/dist/routes/library/navigation.d.ts.map +1 -0
- package/dist/routes/library/navigation.js +39 -0
- package/dist/routes/library/navigation.js.map +1 -0
- package/dist/routes/library/projects.d.ts +5 -0
- package/dist/routes/library/projects.d.ts.map +1 -0
- package/dist/routes/library/projects.js +42 -0
- package/dist/routes/library/projects.js.map +1 -0
- package/dist/routes/library/schemas.d.ts +23 -0
- package/dist/routes/library/schemas.d.ts.map +1 -0
- package/dist/routes/library/schemas.js +10 -0
- package/dist/routes/library/schemas.js.map +1 -0
- package/dist/routes/library/staticPreview.d.ts +4 -0
- package/dist/routes/library/staticPreview.d.ts.map +1 -0
- package/dist/routes/library/staticPreview.js +39 -0
- package/dist/routes/library/staticPreview.js.map +1 -0
- package/dist/routes/library/types.d.ts +22 -0
- package/dist/routes/library/types.d.ts.map +1 -0
- package/dist/routes/library/types.js +3 -0
- package/dist/routes/library/types.js.map +1 -0
- package/dist/routes/library/variants.d.ts +5 -0
- package/dist/routes/library/variants.d.ts.map +1 -0
- package/dist/routes/library/variants.js +35 -0
- package/dist/routes/library/variants.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +18 -30
- package/dist/server.js.map +1 -1
- package/dist/services/HistoryReplayService.js +1 -1
- package/dist/services/HistoryReplayService.js.map +1 -1
- package/dist/services/HubDiscovery.d.ts +46 -0
- package/dist/services/HubDiscovery.d.ts.map +1 -0
- package/dist/services/HubDiscovery.js +58 -0
- package/dist/services/HubDiscovery.js.map +1 -0
- package/dist/services/HubNavigation.d.ts +36 -0
- package/dist/services/HubNavigation.d.ts.map +1 -0
- package/dist/services/HubNavigation.js +76 -0
- package/dist/services/HubNavigation.js.map +1 -0
- package/dist/services/ProjectCardPreviews.d.ts +27 -0
- package/dist/services/ProjectCardPreviews.d.ts.map +1 -0
- package/dist/services/ProjectCardPreviews.js +112 -0
- package/dist/services/ProjectCardPreviews.js.map +1 -0
- package/dist/services/ProjectFolderPicker.d.ts +20 -0
- package/dist/services/ProjectFolderPicker.d.ts.map +1 -0
- package/dist/services/ProjectFolderPicker.js +174 -0
- package/dist/services/ProjectFolderPicker.js.map +1 -0
- package/dist/services/ProjectImport.d.ts +13 -0
- package/dist/services/ProjectImport.d.ts.map +1 -0
- package/dist/services/ProjectImport.js +226 -0
- package/dist/services/ProjectImport.js.map +1 -0
- package/dist/services/ProjectLibrary.d.ts +74 -0
- package/dist/services/ProjectLibrary.d.ts.map +1 -0
- package/dist/services/ProjectLibrary.js +261 -0
- package/dist/services/ProjectLibrary.js.map +1 -0
- package/dist/services/ProjectMetadataStore.d.ts +6 -19
- package/dist/services/ProjectMetadataStore.d.ts.map +1 -1
- package/dist/services/ProjectMetadataStore.js +29 -147
- package/dist/services/ProjectMetadataStore.js.map +1 -1
- package/dist/services/ProjectRegistry.d.ts +80 -0
- package/dist/services/ProjectRegistry.d.ts.map +1 -0
- package/dist/services/ProjectRegistry.js +147 -0
- package/dist/services/ProjectRegistry.js.map +1 -0
- package/dist/services/ProjectRuntimeService.d.ts +18 -0
- package/dist/services/ProjectRuntimeService.d.ts.map +1 -0
- package/dist/services/ProjectRuntimeService.js +143 -0
- package/dist/services/ProjectRuntimeService.js.map +1 -0
- package/dist/services/ProjectScreenshotService.d.ts +15 -0
- package/dist/services/ProjectScreenshotService.d.ts.map +1 -0
- package/dist/services/ProjectScreenshotService.js +90 -0
- package/dist/services/ProjectScreenshotService.js.map +1 -0
- package/dist/services/ProjectStorage.d.ts +20 -0
- package/dist/services/ProjectStorage.d.ts.map +1 -0
- package/dist/services/ProjectStorage.js +41 -0
- package/dist/services/ProjectStorage.js.map +1 -0
- package/dist/services/StaticLibraryPreviews.d.ts +21 -0
- package/dist/services/StaticLibraryPreviews.d.ts.map +1 -0
- package/dist/services/StaticLibraryPreviews.js +61 -0
- package/dist/services/StaticLibraryPreviews.js.map +1 -0
- package/dist/services/TelemetryService.d.ts +7 -0
- package/dist/services/TelemetryService.d.ts.map +1 -1
- package/dist/services/TelemetryService.js +7 -1
- package/dist/services/TelemetryService.js.map +1 -1
- package/dist/services/TreeStore.d.ts +8 -3
- package/dist/services/TreeStore.d.ts.map +1 -1
- package/dist/services/TreeStore.js +39 -18
- package/dist/services/TreeStore.js.map +1 -1
- package/dist/services/VariantGenerationService.d.ts +5 -0
- package/dist/services/VariantGenerationService.d.ts.map +1 -1
- package/dist/services/VariantGenerationService.js +13 -1
- package/dist/services/VariantGenerationService.js.map +1 -1
- package/dist/services/VariantHistoryService.d.ts +18 -162
- package/dist/services/VariantHistoryService.d.ts.map +1 -1
- package/dist/services/VariantHistoryService.js +187 -45
- package/dist/services/VariantHistoryService.js.map +1 -1
- package/dist/services/VariantRunService.d.ts +3 -0
- package/dist/services/VariantRunService.d.ts.map +1 -1
- package/dist/services/VariantRunService.js +2 -0
- package/dist/services/VariantRunService.js.map +1 -1
- package/dist/services/VariantsRuntime.d.ts +4 -0
- package/dist/services/VariantsRuntime.d.ts.map +1 -1
- package/dist/services/VariantsRuntime.js +6 -1
- package/dist/services/VariantsRuntime.js.map +1 -1
- package/dist/services/createAgentVariantsOrchestrator.d.ts +2 -0
- package/dist/services/createAgentVariantsOrchestrator.d.ts.map +1 -1
- package/dist/services/createAgentVariantsOrchestrator.js +1 -0
- package/dist/services/createAgentVariantsOrchestrator.js.map +1 -1
- package/dist/services/historyRoots.d.ts +14 -0
- package/dist/services/historyRoots.d.ts.map +1 -0
- package/dist/services/historyRoots.js +44 -0
- package/dist/services/historyRoots.js.map +1 -0
- package/dist/services/libraryErrors.d.ts +7 -0
- package/dist/services/libraryErrors.d.ts.map +1 -0
- package/dist/services/libraryErrors.js +14 -0
- package/dist/services/libraryErrors.js.map +1 -0
- package/dist/storage/library/BundleMetadataStore.d.ts +53 -0
- package/dist/storage/library/BundleMetadataStore.d.ts.map +1 -0
- package/dist/storage/library/BundleMetadataStore.js +317 -0
- package/dist/storage/library/BundleMetadataStore.js.map +1 -0
- package/dist/storage/library/CoordinatorRecords.d.ts +25 -0
- package/dist/storage/library/CoordinatorRecords.d.ts.map +1 -0
- package/dist/storage/library/CoordinatorRecords.js +84 -0
- package/dist/storage/library/CoordinatorRecords.js.map +1 -0
- package/dist/storage/library/ProjectPreviewCache.d.ts +34 -0
- package/dist/storage/library/ProjectPreviewCache.d.ts.map +1 -0
- package/dist/storage/library/ProjectPreviewCache.js +62 -0
- package/dist/storage/library/ProjectPreviewCache.js.map +1 -0
- package/dist/storage/library/ProjectRecords.d.ts +64 -0
- package/dist/storage/library/ProjectRecords.d.ts.map +1 -0
- package/dist/storage/library/ProjectRecords.js +139 -0
- package/dist/storage/library/ProjectRecords.js.map +1 -0
- package/dist/storage/library/database.d.ts +13 -0
- package/dist/storage/library/database.d.ts.map +1 -0
- package/dist/storage/library/database.js +106 -0
- package/dist/storage/library/database.js.map +1 -0
- package/dist/storage/library/migrations.d.ts +5 -0
- package/dist/storage/library/migrations.d.ts.map +1 -0
- package/dist/storage/library/migrations.js +61 -0
- package/dist/storage/library/migrations.js.map +1 -0
- package/dist/storage/library/schema/bundle.d.ts +734 -0
- package/dist/storage/library/schema/bundle.d.ts.map +1 -0
- package/dist/storage/library/schema/bundle.js +79 -0
- package/dist/storage/library/schema/bundle.js.map +1 -0
- package/dist/storage/library/schema/coordinator.d.ts +72 -0
- package/dist/storage/library/schema/coordinator.d.ts.map +1 -0
- package/dist/storage/library/schema/coordinator.js +12 -0
- package/dist/storage/library/schema/coordinator.js.map +1 -0
- package/dist/storage/library/schema/registry.d.ts +198 -0
- package/dist/storage/library/schema/registry.d.ts.map +1 -0
- package/dist/storage/library/schema/registry.js +32 -0
- package/dist/storage/library/schema/registry.js.map +1 -0
- package/dist/storage/library/sourcePresentation.d.ts +3 -0
- package/dist/storage/library/sourcePresentation.d.ts.map +1 -0
- package/dist/storage/library/sourcePresentation.js +70 -0
- package/dist/storage/library/sourcePresentation.js.map +1 -0
- package/dist/storage/project-metadata/ProjectMetadataRecords.d.ts +41 -0
- package/dist/storage/project-metadata/ProjectMetadataRecords.d.ts.map +1 -0
- package/dist/storage/project-metadata/ProjectMetadataRecords.js +120 -0
- package/dist/storage/project-metadata/ProjectMetadataRecords.js.map +1 -0
- package/dist/storage/project-metadata/database.d.ts +12 -0
- package/dist/storage/project-metadata/database.d.ts.map +1 -0
- package/dist/storage/project-metadata/database.js +79 -0
- package/dist/storage/project-metadata/database.js.map +1 -0
- package/dist/{services/projectMetadataMigrations.d.ts → storage/project-metadata/migrations.d.ts} +1 -1
- package/dist/storage/project-metadata/migrations.d.ts.map +1 -0
- package/dist/{services/projectMetadataMigrations.js → storage/project-metadata/migrations.js} +1 -1
- package/dist/storage/project-metadata/migrations.js.map +1 -0
- package/dist/storage/project-metadata/schema.d.ts +288 -0
- package/dist/storage/project-metadata/schema.d.ts.map +1 -0
- package/dist/storage/project-metadata/schema.js +35 -0
- package/dist/storage/project-metadata/schema.js.map +1 -0
- package/dist/types/account.d.ts +8 -0
- package/dist/types/account.d.ts.map +1 -0
- package/dist/types/account.js +3 -0
- package/dist/types/account.js.map +1 -0
- package/dist/types/project-library.d.ts +28 -0
- package/dist/types/project-library.d.ts.map +1 -0
- package/dist/types/project-library.js +3 -0
- package/dist/types/project-library.js.map +1 -0
- package/dist/types/variant-history.d.ts +173 -0
- package/dist/types/variant-history.d.ts.map +1 -0
- package/dist/types/variant-history.js +3 -0
- package/dist/types/variant-history.js.map +1 -0
- package/dist/utils/htmlDocument.d.ts +13 -0
- package/dist/utils/htmlDocument.d.ts.map +1 -0
- package/dist/utils/htmlDocument.js +42 -0
- package/dist/utils/htmlDocument.js.map +1 -0
- package/dist/utils/windowPlacement.d.ts +20 -0
- package/dist/utils/windowPlacement.d.ts.map +1 -0
- package/dist/utils/windowPlacement.js +20 -0
- package/dist/utils/windowPlacement.js.map +1 -0
- package/package.json +10 -3
- package/scripts/verify-node-version.cjs +9 -6
- package/src/ui/dist/assets/LibraryApp-B2MZyxIp.js +16 -0
- package/src/ui/dist/assets/main-1IMq5Huu.css +1 -0
- package/src/ui/dist/assets/main-BId3Sa7r.js +438 -0
- package/src/ui/dist/favicon-16.png +0 -0
- package/src/ui/dist/favicon-32.png +0 -0
- package/src/ui/dist/favicon.ico +0 -0
- package/src/ui/dist/index.html +2 -2
- package/dist/services/projectMetadataMigrations.d.ts.map +0 -1
- package/dist/services/projectMetadataMigrations.js.map +0 -1
- package/src/ui/dist/assets/main-BjwDfDy8.js +0 -423
- package/src/ui/dist/assets/main-Ct1aZend.css +0 -1
|
@@ -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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
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.ProjectRecords = 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 registry_1 = require("./schema/registry");
|
|
12
|
+
const projectFields = {
|
|
13
|
+
id: registry_1.projects.id,
|
|
14
|
+
workspaceId: registry_1.workspaces.id,
|
|
15
|
+
name: registry_1.projects.name,
|
|
16
|
+
projectPath: registry_1.workspaces.canonicalPath,
|
|
17
|
+
createdAt: registry_1.projects.createdAt,
|
|
18
|
+
lastOpenedAt: registry_1.projects.lastOpenedAt,
|
|
19
|
+
storageKind: registry_1.projects.storageKind,
|
|
20
|
+
sourceFingerprint: registry_1.projects.sourceFingerprint,
|
|
21
|
+
};
|
|
22
|
+
/** Persists project identities and their machine-specific workspace attachments. */
|
|
23
|
+
class ProjectRecords {
|
|
24
|
+
db;
|
|
25
|
+
constructor(db) {
|
|
26
|
+
this.db = db;
|
|
27
|
+
}
|
|
28
|
+
/** Opens the registry with its durable schema and write coordination. */
|
|
29
|
+
static async open(root) {
|
|
30
|
+
return new ProjectRecords(await (0, database_1.openDurableDatabase)({
|
|
31
|
+
databasePath: path_1.default.join(root, 'registry.sqlite'),
|
|
32
|
+
schema: migrations_1.REGISTRY_SCHEMA,
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
/** Runs related reads and writes under one immediate transaction. */
|
|
36
|
+
transaction(operation) {
|
|
37
|
+
return (0, database_1.transaction)(this.db, operation);
|
|
38
|
+
}
|
|
39
|
+
/** Lists persisted attachments in stable last-opened order. */
|
|
40
|
+
list() {
|
|
41
|
+
return this.db
|
|
42
|
+
.select(projectFields)
|
|
43
|
+
.from(registry_1.projects)
|
|
44
|
+
.innerJoin(registry_1.workspaces, (0, drizzle_orm_1.eq)(registry_1.workspaces.projectId, registry_1.projects.id))
|
|
45
|
+
.orderBy((0, drizzle_orm_1.desc)(registry_1.projects.lastOpenedAt), registry_1.projects.id)
|
|
46
|
+
.all();
|
|
47
|
+
}
|
|
48
|
+
/** Reads a single project and its workspace attachment. */
|
|
49
|
+
get(projectId) {
|
|
50
|
+
return (this.db
|
|
51
|
+
.select(projectFields)
|
|
52
|
+
.from(registry_1.projects)
|
|
53
|
+
.innerJoin(registry_1.workspaces, (0, drizzle_orm_1.eq)(registry_1.workspaces.projectId, registry_1.projects.id))
|
|
54
|
+
.where((0, drizzle_orm_1.eq)(registry_1.projects.id, projectId))
|
|
55
|
+
.get() ?? null);
|
|
56
|
+
}
|
|
57
|
+
/** Finds the owner of a canonical workspace or attributed history root. */
|
|
58
|
+
findByPath(canonicalPath) {
|
|
59
|
+
const owners = this.db
|
|
60
|
+
.select({ projectId: registry_1.historyRoots.projectId })
|
|
61
|
+
.from(registry_1.historyRoots)
|
|
62
|
+
.where((0, drizzle_orm_1.eq)(registry_1.historyRoots.canonicalPath, canonicalPath));
|
|
63
|
+
return (this.db
|
|
64
|
+
.select(projectFields)
|
|
65
|
+
.from(registry_1.projects)
|
|
66
|
+
.innerJoin(registry_1.workspaces, (0, drizzle_orm_1.eq)(registry_1.workspaces.projectId, registry_1.projects.id))
|
|
67
|
+
.where((0, drizzle_orm_1.or)((0, drizzle_orm_1.eq)(registry_1.workspaces.canonicalPath, canonicalPath), (0, drizzle_orm_1.inArray)(registry_1.projects.id, owners)))
|
|
68
|
+
.get() ?? null);
|
|
69
|
+
}
|
|
70
|
+
/** Inserts a project and its workspace within the caller's transaction. */
|
|
71
|
+
insert(record) {
|
|
72
|
+
this.db
|
|
73
|
+
.insert(registry_1.projects)
|
|
74
|
+
.values({
|
|
75
|
+
id: record.id,
|
|
76
|
+
name: record.name,
|
|
77
|
+
createdAt: record.createdAt,
|
|
78
|
+
lastOpenedAt: record.createdAt,
|
|
79
|
+
})
|
|
80
|
+
.run();
|
|
81
|
+
this.db
|
|
82
|
+
.insert(registry_1.workspaces)
|
|
83
|
+
.values({
|
|
84
|
+
id: record.workspaceId,
|
|
85
|
+
projectId: record.id,
|
|
86
|
+
canonicalPath: record.canonicalPath,
|
|
87
|
+
})
|
|
88
|
+
.run();
|
|
89
|
+
}
|
|
90
|
+
/** Records the time a registered project was opened. */
|
|
91
|
+
recordOpening(projectId, lastOpenedAt) {
|
|
92
|
+
this.db
|
|
93
|
+
.update(registry_1.projects)
|
|
94
|
+
.set({ lastOpenedAt })
|
|
95
|
+
.where((0, drizzle_orm_1.eq)(registry_1.projects.id, projectId))
|
|
96
|
+
.run();
|
|
97
|
+
}
|
|
98
|
+
/** Records one explicitly attributed generated history directory. */
|
|
99
|
+
attachHistoryRoot(projectId, canonicalPath) {
|
|
100
|
+
this.db
|
|
101
|
+
.insert(registry_1.historyRoots)
|
|
102
|
+
.values({ projectId, canonicalPath })
|
|
103
|
+
.onConflictDoNothing()
|
|
104
|
+
.run();
|
|
105
|
+
}
|
|
106
|
+
/** Lists the persisted generated history attachments for a project. */
|
|
107
|
+
historyRoots(projectId) {
|
|
108
|
+
return this.db
|
|
109
|
+
.select({ path: registry_1.historyRoots.canonicalPath })
|
|
110
|
+
.from(registry_1.historyRoots)
|
|
111
|
+
.where((0, drizzle_orm_1.eq)(registry_1.historyRoots.projectId, projectId))
|
|
112
|
+
.all()
|
|
113
|
+
.map((row) => row.path);
|
|
114
|
+
}
|
|
115
|
+
/** Updates a workspace attachment without changing either identity. */
|
|
116
|
+
relink(projectId, canonicalPath) {
|
|
117
|
+
this.db
|
|
118
|
+
.update(registry_1.workspaces)
|
|
119
|
+
.set({ canonicalPath })
|
|
120
|
+
.where((0, drizzle_orm_1.eq)(registry_1.workspaces.projectId, projectId))
|
|
121
|
+
.run();
|
|
122
|
+
}
|
|
123
|
+
/** Publishes the authoritative storage owner and its verified source fingerprint. */
|
|
124
|
+
activateBundle(projectId, sourceFingerprint) {
|
|
125
|
+
this.transaction(() => {
|
|
126
|
+
this.db
|
|
127
|
+
.update(registry_1.projects)
|
|
128
|
+
.set({ storageKind: 'bundle', sourceFingerprint })
|
|
129
|
+
.where((0, drizzle_orm_1.eq)(registry_1.projects.id, projectId))
|
|
130
|
+
.run();
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
/** Releases the registry connection. */
|
|
134
|
+
close() {
|
|
135
|
+
(0, database_1.closeDatabase)(this.db);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
exports.ProjectRecords = ProjectRecords;
|
|
139
|
+
//# sourceMappingURL=ProjectRecords.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectRecords.js","sourceRoot":"","sources":["../../../src/storage/library/ProjectRecords.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AACxB,6CAAoD;AACpD,yCAA6E;AAC7E,6CAA+C;AAC/C,gDAAuE;AAGvE,MAAM,aAAa,GAAG;IACpB,EAAE,EAAE,mBAAQ,CAAC,EAAE;IACf,WAAW,EAAE,qBAAU,CAAC,EAAE;IAC1B,IAAI,EAAE,mBAAQ,CAAC,IAAI;IACnB,WAAW,EAAE,qBAAU,CAAC,aAAa;IACrC,SAAS,EAAE,mBAAQ,CAAC,SAAS;IAC7B,YAAY,EAAE,mBAAQ,CAAC,YAAY;IACnC,WAAW,EAAE,mBAAQ,CAAC,WAAW;IACjC,iBAAiB,EAAE,mBAAQ,CAAC,iBAAiB;CAC9C,CAAC;AAGF,oFAAoF;AACpF,MAAa,cAAc;IACY;IAArC,YAAqC,EAAY;QAAZ,OAAE,GAAF,EAAE,CAAU;IAAG,CAAC;IAErD,yEAAyE;IACzE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAY;QAC5B,OAAO,IAAI,cAAc,CACvB,MAAM,IAAA,8BAAmB,EAAC;YACxB,YAAY,EAAE,cAAI,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC;YAChD,MAAM,EAAE,4BAAe;SACxB,CAAC,CACH,CAAC;IACJ,CAAC;IAED,qEAAqE;IACrE,WAAW,CAAI,SAAkB;QAC/B,OAAO,IAAA,sBAAW,EAAC,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IACzC,CAAC;IAED,+DAA+D;IAC/D,IAAI;QACF,OAAO,IAAI,CAAC,EAAE;aACX,MAAM,CAAC,aAAa,CAAC;aACrB,IAAI,CAAC,mBAAQ,CAAC;aACd,SAAS,CAAC,qBAAU,EAAE,IAAA,gBAAE,EAAC,qBAAU,CAAC,SAAS,EAAE,mBAAQ,CAAC,EAAE,CAAC,CAAC;aAC5D,OAAO,CAAC,IAAA,kBAAI,EAAC,mBAAQ,CAAC,YAAY,CAAC,EAAE,mBAAQ,CAAC,EAAE,CAAC;aACjD,GAAG,EAAE,CAAC;IACX,CAAC;IAED,2DAA2D;IAC3D,GAAG,CAAC,SAAiB;QACnB,OAAO,CACL,IAAI,CAAC,EAAE;aACJ,MAAM,CAAC,aAAa,CAAC;aACrB,IAAI,CAAC,mBAAQ,CAAC;aACd,SAAS,CAAC,qBAAU,EAAE,IAAA,gBAAE,EAAC,qBAAU,CAAC,SAAS,EAAE,mBAAQ,CAAC,EAAE,CAAC,CAAC;aAC5D,KAAK,CAAC,IAAA,gBAAE,EAAC,mBAAQ,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;aACjC,GAAG,EAAE,IAAI,IAAI,CACjB,CAAC;IACJ,CAAC;IAED,2EAA2E;IAC3E,UAAU,CAAC,aAAqB;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE;aACnB,MAAM,CAAC,EAAE,SAAS,EAAE,uBAAY,CAAC,SAAS,EAAE,CAAC;aAC7C,IAAI,CAAC,uBAAY,CAAC;aAClB,KAAK,CAAC,IAAA,gBAAE,EAAC,uBAAY,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;QACxD,OAAO,CACL,IAAI,CAAC,EAAE;aACJ,MAAM,CAAC,aAAa,CAAC;aACrB,IAAI,CAAC,mBAAQ,CAAC;aACd,SAAS,CAAC,qBAAU,EAAE,IAAA,gBAAE,EAAC,qBAAU,CAAC,SAAS,EAAE,mBAAQ,CAAC,EAAE,CAAC,CAAC;aAC5D,KAAK,CACJ,IAAA,gBAAE,EACA,IAAA,gBAAE,EAAC,qBAAU,CAAC,aAAa,EAAE,aAAa,CAAC,EAC3C,IAAA,qBAAO,EAAC,mBAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,CAC7B,CACF;aACA,GAAG,EAAE,IAAI,IAAI,CACjB,CAAC;IACJ,CAAC;IAED,2EAA2E;IAC3E,MAAM,CAAC,MAMN;QACC,IAAI,CAAC,EAAE;aACJ,MAAM,CAAC,mBAAQ,CAAC;aAChB,MAAM,CAAC;YACN,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,YAAY,EAAE,MAAM,CAAC,SAAS;SAC/B,CAAC;aACD,GAAG,EAAE,CAAC;QACT,IAAI,CAAC,EAAE;aACJ,MAAM,CAAC,qBAAU,CAAC;aAClB,MAAM,CAAC;YACN,EAAE,EAAE,MAAM,CAAC,WAAW;YACtB,SAAS,EAAE,MAAM,CAAC,EAAE;YACpB,aAAa,EAAE,MAAM,CAAC,aAAa;SACpC,CAAC;aACD,GAAG,EAAE,CAAC;IACX,CAAC;IAED,wDAAwD;IACxD,aAAa,CAAC,SAAiB,EAAE,YAAoB;QACnD,IAAI,CAAC,EAAE;aACJ,MAAM,CAAC,mBAAQ,CAAC;aAChB,GAAG,CAAC,EAAE,YAAY,EAAE,CAAC;aACrB,KAAK,CAAC,IAAA,gBAAE,EAAC,mBAAQ,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;aACjC,GAAG,EAAE,CAAC;IACX,CAAC;IAED,qEAAqE;IACrE,iBAAiB,CAAC,SAAiB,EAAE,aAAqB;QACxD,IAAI,CAAC,EAAE;aACJ,MAAM,CAAC,uBAAY,CAAC;aACpB,MAAM,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;aACpC,mBAAmB,EAAE;aACrB,GAAG,EAAE,CAAC;IACX,CAAC;IAED,uEAAuE;IACvE,YAAY,CAAC,SAAiB;QAC5B,OAAO,IAAI,CAAC,EAAE;aACX,MAAM,CAAC,EAAE,IAAI,EAAE,uBAAY,CAAC,aAAa,EAAE,CAAC;aAC5C,IAAI,CAAC,uBAAY,CAAC;aAClB,KAAK,CAAC,IAAA,gBAAE,EAAC,uBAAY,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;aAC5C,GAAG,EAAE;aACL,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,uEAAuE;IACvE,MAAM,CAAC,SAAiB,EAAE,aAAqB;QAC7C,IAAI,CAAC,EAAE;aACJ,MAAM,CAAC,qBAAU,CAAC;aAClB,GAAG,CAAC,EAAE,aAAa,EAAE,CAAC;aACtB,KAAK,CAAC,IAAA,gBAAE,EAAC,qBAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;aAC1C,GAAG,EAAE,CAAC;IACX,CAAC;IAED,qFAAqF;IACrF,cAAc,CAAC,SAAiB,EAAE,iBAAgC;QAChE,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE;YACpB,IAAI,CAAC,EAAE;iBACJ,MAAM,CAAC,mBAAQ,CAAC;iBAChB,GAAG,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;iBACjD,KAAK,CAAC,IAAA,gBAAE,EAAC,mBAAQ,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;iBACjC,GAAG,EAAE,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC;IAED,wCAAwC;IACxC,KAAK;QACH,IAAA,wBAAa,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC;CACF;AA5ID,wCA4IC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { drizzle } from 'drizzle-orm/node-sqlite';
|
|
2
|
+
interface OpenDatabaseOptions {
|
|
3
|
+
databasePath: string;
|
|
4
|
+
schema: string;
|
|
5
|
+
}
|
|
6
|
+
/** Releases a typed database's underlying SQLite connection. */
|
|
7
|
+
export declare const closeDatabase: (db: ReturnType<typeof drizzle>) => void;
|
|
8
|
+
/** Opens durable user data without deleting or recreating unreadable databases. */
|
|
9
|
+
export declare const openDurableDatabase: ({ databasePath, schema, }: OpenDatabaseOptions) => Promise<ReturnType<typeof drizzle>>;
|
|
10
|
+
/** Commits a short metadata mutation or rolls back every statement on failure. */
|
|
11
|
+
export declare const transaction: <T>(db: ReturnType<typeof drizzle>, operation: () => T) => T;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=database.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/storage/library/database.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAGlD,UAAU,mBAAmB;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAKD,gEAAgE;AAChE,eAAO,MAAM,aAAa,GAAI,IAAI,UAAU,CAAC,OAAO,OAAO,CAAC,KAAG,IAE9D,CAAC;AAEF,mFAAmF;AACnF,eAAO,MAAM,mBAAmB,GAAU,2BAGvC,mBAAmB,KAAG,OAAO,CAAC,UAAU,CAAC,OAAO,OAAO,CAAC,CAqC1D,CAAC;AAEF,kFAAkF;AAClF,eAAO,MAAM,WAAW,GAAI,CAAC,EAC3B,IAAI,UAAU,CAAC,OAAO,OAAO,CAAC,EAC9B,WAAW,MAAM,CAAC,KACjB,CAYF,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.transaction = exports.openDurableDatabase = exports.closeDatabase = void 0;
|
|
40
|
+
const drizzle_orm_1 = require("drizzle-orm");
|
|
41
|
+
const fs_1 = __importDefault(require("fs"));
|
|
42
|
+
const node_sqlite_1 = require("drizzle-orm/node-sqlite");
|
|
43
|
+
const path_1 = __importDefault(require("path"));
|
|
44
|
+
const SCHEMA_VERSION = 1;
|
|
45
|
+
const BUSY_TIMEOUT_MS = 5_000;
|
|
46
|
+
/** Releases a typed database's underlying SQLite connection. */
|
|
47
|
+
const closeDatabase = (db) => {
|
|
48
|
+
db.$client.close();
|
|
49
|
+
};
|
|
50
|
+
exports.closeDatabase = closeDatabase;
|
|
51
|
+
/** Opens durable user data without deleting or recreating unreadable databases. */
|
|
52
|
+
const openDurableDatabase = async ({ databasePath, schema, }) => {
|
|
53
|
+
const { DatabaseSync } = await Promise.resolve().then(() => __importStar(require('node:sqlite')));
|
|
54
|
+
fs_1.default.mkdirSync(path_1.default.dirname(databasePath), { recursive: true, mode: 0o700 });
|
|
55
|
+
const db = new DatabaseSync(databasePath);
|
|
56
|
+
try {
|
|
57
|
+
db.exec(`PRAGMA busy_timeout = ${BUSY_TIMEOUT_MS}`);
|
|
58
|
+
const version = () => Number(db.prepare('PRAGMA user_version').get()?.user_version);
|
|
59
|
+
const assertSupported = () => {
|
|
60
|
+
if (version() > SCHEMA_VERSION)
|
|
61
|
+
throw new Error(`Unsupported database schema ${version()} (supported: ${SCHEMA_VERSION}); leaving ${databasePath} untouched`);
|
|
62
|
+
};
|
|
63
|
+
assertSupported();
|
|
64
|
+
if (version() === 0) {
|
|
65
|
+
db.exec('BEGIN IMMEDIATE');
|
|
66
|
+
try {
|
|
67
|
+
assertSupported();
|
|
68
|
+
if (version() === 0) {
|
|
69
|
+
db.exec(schema);
|
|
70
|
+
db.exec(`PRAGMA user_version = ${SCHEMA_VERSION}`);
|
|
71
|
+
}
|
|
72
|
+
db.exec('COMMIT');
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
db.exec('ROLLBACK');
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
db.exec('PRAGMA foreign_keys = ON');
|
|
80
|
+
db.exec('PRAGMA journal_mode = WAL');
|
|
81
|
+
fs_1.default.chmodSync(databasePath, 0o600);
|
|
82
|
+
return (0, node_sqlite_1.drizzle)({ client: db });
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
db.close();
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
exports.openDurableDatabase = openDurableDatabase;
|
|
90
|
+
/** Commits a short metadata mutation or rolls back every statement on failure. */
|
|
91
|
+
const transaction = (db, operation) => {
|
|
92
|
+
db.$client.exec('BEGIN IMMEDIATE');
|
|
93
|
+
try {
|
|
94
|
+
const value = operation();
|
|
95
|
+
db.$client.exec('COMMIT');
|
|
96
|
+
return value;
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
db.$client.exec('ROLLBACK');
|
|
100
|
+
if (error instanceof drizzle_orm_1.DrizzleQueryError && error.cause !== undefined)
|
|
101
|
+
throw error.cause;
|
|
102
|
+
throw error;
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
exports.transaction = transaction;
|
|
106
|
+
//# sourceMappingURL=database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/storage/library/database.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Durable metadata; artifact bodies remain in the bundle's files and Git store. */
|
|
2
|
+
export declare const BUNDLE_SCHEMA = "\n CREATE TABLE project (\n singleton INTEGER PRIMARY KEY CHECK(singleton = 1),\n id TEXT NOT NULL UNIQUE, name TEXT NOT NULL,\n created_at TEXT NOT NULL, updated_at TEXT NOT NULL\n );\n CREATE TABLE sessions (\n id TEXT PRIMARY KEY, initial_prompt TEXT NOT NULL,\n project_kind TEXT NOT NULL, source_workspace_id TEXT,\n created_at TEXT NOT NULL, context_path TEXT, details_json TEXT NOT NULL\n );\n CREATE TABLE batches (\n id TEXT NOT NULL, session_id TEXT NOT NULL REFERENCES sessions(id),\n request_id TEXT, label TEXT, instruction TEXT, created_at TEXT NOT NULL,\n context_path TEXT, PRIMARY KEY(session_id, id)\n );\n CREATE TABLE snapshots (\n id TEXT PRIMARY KEY, git_ref TEXT NOT NULL, commit_sha TEXT NOT NULL,\n tree_sha TEXT, created_at TEXT NOT NULL\n );\n CREATE TABLE variants (\n session_id TEXT NOT NULL REFERENCES sessions(id), variant_id TEXT NOT NULL,\n batch_id TEXT NOT NULL, label TEXT NOT NULL, brief TEXT NOT NULL,\n status TEXT NOT NULL, created_at TEXT NOT NULL, status_changed_at TEXT NOT NULL,\n snapshot_id TEXT REFERENCES snapshots(id), base_snapshot_id TEXT REFERENCES snapshots(id),\n parent_snapshot_id TEXT REFERENCES snapshots(id),\n parent_session_id TEXT, parent_variant_id TEXT,\n changed_files_count INTEGER NOT NULL, artifact_path TEXT, details_json TEXT NOT NULL,\n PRIMARY KEY(session_id, variant_id),\n FOREIGN KEY(session_id, batch_id) REFERENCES batches(session_id, id)\n );\n CREATE INDEX variants_created_at ON variants(created_at DESC);\n CREATE INDEX variants_status ON variants(status);\n CREATE TABLE presentation (\n key TEXT PRIMARY KEY, value_json TEXT NOT NULL, updated_at TEXT NOT NULL\n );\n";
|
|
3
|
+
export declare const REGISTRY_SCHEMA = "\n CREATE TABLE projects (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n created_at TEXT NOT NULL,\n last_opened_at TEXT NOT NULL,\n storage_kind TEXT NOT NULL DEFAULT 'project' CHECK(storage_kind IN ('project', 'bundle')),\n source_fingerprint TEXT\n );\n CREATE TABLE workspaces (\n id TEXT PRIMARY KEY,\n project_id TEXT NOT NULL UNIQUE REFERENCES projects(id),\n canonical_path TEXT NOT NULL UNIQUE\n );\n CREATE TABLE history_roots (\n canonical_path TEXT PRIMARY KEY, project_id TEXT NOT NULL REFERENCES projects(id)\n );\n";
|
|
4
|
+
export declare const COORDINATOR_SCHEMA = "CREATE TABLE coordinator(singleton INTEGER PRIMARY KEY CHECK(singleton=1), pid INTEGER NOT NULL, token TEXT NOT NULL, port INTEGER)";
|
|
5
|
+
//# sourceMappingURL=migrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../../src/storage/library/migrations.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,eAAO,MAAM,aAAa,osDAoCzB,CAAC;AAEF,eAAO,MAAM,eAAe,2jBAiB3B,CAAC;AAEF,eAAO,MAAM,kBAAkB,wIACwG,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.COORDINATOR_SCHEMA = exports.REGISTRY_SCHEMA = exports.BUNDLE_SCHEMA = void 0;
|
|
4
|
+
/** Durable metadata; artifact bodies remain in the bundle's files and Git store. */
|
|
5
|
+
exports.BUNDLE_SCHEMA = `
|
|
6
|
+
CREATE TABLE project (
|
|
7
|
+
singleton INTEGER PRIMARY KEY CHECK(singleton = 1),
|
|
8
|
+
id TEXT NOT NULL UNIQUE, name TEXT NOT NULL,
|
|
9
|
+
created_at TEXT NOT NULL, updated_at TEXT NOT NULL
|
|
10
|
+
);
|
|
11
|
+
CREATE TABLE sessions (
|
|
12
|
+
id TEXT PRIMARY KEY, initial_prompt TEXT NOT NULL,
|
|
13
|
+
project_kind TEXT NOT NULL, source_workspace_id TEXT,
|
|
14
|
+
created_at TEXT NOT NULL, context_path TEXT, details_json TEXT NOT NULL
|
|
15
|
+
);
|
|
16
|
+
CREATE TABLE batches (
|
|
17
|
+
id TEXT NOT NULL, session_id TEXT NOT NULL REFERENCES sessions(id),
|
|
18
|
+
request_id TEXT, label TEXT, instruction TEXT, created_at TEXT NOT NULL,
|
|
19
|
+
context_path TEXT, PRIMARY KEY(session_id, id)
|
|
20
|
+
);
|
|
21
|
+
CREATE TABLE snapshots (
|
|
22
|
+
id TEXT PRIMARY KEY, git_ref TEXT NOT NULL, commit_sha TEXT NOT NULL,
|
|
23
|
+
tree_sha TEXT, created_at TEXT NOT NULL
|
|
24
|
+
);
|
|
25
|
+
CREATE TABLE variants (
|
|
26
|
+
session_id TEXT NOT NULL REFERENCES sessions(id), variant_id TEXT NOT NULL,
|
|
27
|
+
batch_id TEXT NOT NULL, label TEXT NOT NULL, brief TEXT NOT NULL,
|
|
28
|
+
status TEXT NOT NULL, created_at TEXT NOT NULL, status_changed_at TEXT NOT NULL,
|
|
29
|
+
snapshot_id TEXT REFERENCES snapshots(id), base_snapshot_id TEXT REFERENCES snapshots(id),
|
|
30
|
+
parent_snapshot_id TEXT REFERENCES snapshots(id),
|
|
31
|
+
parent_session_id TEXT, parent_variant_id TEXT,
|
|
32
|
+
changed_files_count INTEGER NOT NULL, artifact_path TEXT, details_json TEXT NOT NULL,
|
|
33
|
+
PRIMARY KEY(session_id, variant_id),
|
|
34
|
+
FOREIGN KEY(session_id, batch_id) REFERENCES batches(session_id, id)
|
|
35
|
+
);
|
|
36
|
+
CREATE INDEX variants_created_at ON variants(created_at DESC);
|
|
37
|
+
CREATE INDEX variants_status ON variants(status);
|
|
38
|
+
CREATE TABLE presentation (
|
|
39
|
+
key TEXT PRIMARY KEY, value_json TEXT NOT NULL, updated_at TEXT NOT NULL
|
|
40
|
+
);
|
|
41
|
+
`;
|
|
42
|
+
exports.REGISTRY_SCHEMA = `
|
|
43
|
+
CREATE TABLE projects (
|
|
44
|
+
id TEXT PRIMARY KEY,
|
|
45
|
+
name TEXT NOT NULL,
|
|
46
|
+
created_at TEXT NOT NULL,
|
|
47
|
+
last_opened_at TEXT NOT NULL,
|
|
48
|
+
storage_kind TEXT NOT NULL DEFAULT 'project' CHECK(storage_kind IN ('project', 'bundle')),
|
|
49
|
+
source_fingerprint TEXT
|
|
50
|
+
);
|
|
51
|
+
CREATE TABLE workspaces (
|
|
52
|
+
id TEXT PRIMARY KEY,
|
|
53
|
+
project_id TEXT NOT NULL UNIQUE REFERENCES projects(id),
|
|
54
|
+
canonical_path TEXT NOT NULL UNIQUE
|
|
55
|
+
);
|
|
56
|
+
CREATE TABLE history_roots (
|
|
57
|
+
canonical_path TEXT PRIMARY KEY, project_id TEXT NOT NULL REFERENCES projects(id)
|
|
58
|
+
);
|
|
59
|
+
`;
|
|
60
|
+
exports.COORDINATOR_SCHEMA = 'CREATE TABLE coordinator(singleton INTEGER PRIMARY KEY CHECK(singleton=1), pid INTEGER NOT NULL, token TEXT NOT NULL, port INTEGER)';
|
|
61
|
+
//# sourceMappingURL=migrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../../src/storage/library/migrations.ts"],"names":[],"mappings":";;;AAAA,oFAAoF;AACvE,QAAA,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoC5B,CAAC;AAEW,QAAA,eAAe,GAAG;;;;;;;;;;;;;;;;;CAiB9B,CAAC;AAEW,QAAA,kBAAkB,GAC7B,qIAAqI,CAAC"}
|