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.
- 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/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 +13 -45
- 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 +17 -162
- package/dist/services/VariantHistoryService.d.ts.map +1 -1
- package/dist/services/VariantHistoryService.js +186 -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/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 +8 -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-C1kowo8p.js +0 -438
- package/src/ui/dist/assets/main-Ct1aZend.css +0 -1
|
@@ -0,0 +1,226 @@
|
|
|
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.importProject = void 0;
|
|
7
|
+
const sourcePresentation_1 = require("../storage/library/sourcePresentation");
|
|
8
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
9
|
+
const historyRoots_1 = require("./historyRoots");
|
|
10
|
+
const fs_1 = __importDefault(require("fs"));
|
|
11
|
+
const path_1 = __importDefault(require("path"));
|
|
12
|
+
const crypto_1 = require("crypto");
|
|
13
|
+
const serverHandshake_1 = require("../cli/serverHandshake");
|
|
14
|
+
const pid_1 = require("../utils/pid");
|
|
15
|
+
const TreeStore_1 = require("./TreeStore");
|
|
16
|
+
const ProjectStorage_1 = require("./ProjectStorage");
|
|
17
|
+
const BundleMetadataStore_1 = require("../storage/library/BundleMetadataStore");
|
|
18
|
+
const importFiles_1 = require("../library/importFiles");
|
|
19
|
+
const RECEIPT_FILENAME = 'import-receipt.json';
|
|
20
|
+
const RUNTIME_CHANNELS = ['production', 'local'];
|
|
21
|
+
/** Preserves active and uncertain writers rather than attempting to stop their work. */
|
|
22
|
+
const sourceCanWrite = (projectPath, channel) => {
|
|
23
|
+
const discovery = (0, serverHandshake_1.readHandshakeResult)(projectPath, channel);
|
|
24
|
+
if (discovery.status === 'invalid')
|
|
25
|
+
return true;
|
|
26
|
+
if (discovery.status === 'found' && (0, pid_1.isPidAlive)(discovery.handshake.pid))
|
|
27
|
+
return true;
|
|
28
|
+
const lock = path_1.default.join((0, serverHandshake_1.serverRuntimeDirectory)(projectPath, channel), 'server.lock');
|
|
29
|
+
try {
|
|
30
|
+
const holder = Number(fs_1.default.readFileSync(lock, 'utf8'));
|
|
31
|
+
return !Number.isInteger(holder) || holder <= 0 || (0, pid_1.isPidAlive)(holder);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
return error.code !== 'ENOENT';
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
/** Verifies every referenced file and snapshot before an imported record is activated. */
|
|
38
|
+
const verifyImportedVariant = async ({ manifest, artifactRoot, trees, projectPath, }) => {
|
|
39
|
+
if (manifest.artifact.kind === 'diff')
|
|
40
|
+
await (0, importFiles_1.verifyArtifactFile)(artifactRoot, manifest.artifact.diffPath);
|
|
41
|
+
if (manifest.artifact.filesPath &&
|
|
42
|
+
!(await promises_1.default.stat(path_1.default.join(artifactRoot, manifest.artifact.filesPath))).isDirectory())
|
|
43
|
+
throw new Error('Missing saved files');
|
|
44
|
+
if (manifest.preview.kind === 'static')
|
|
45
|
+
await (0, importFiles_1.verifyArtifactFile)(artifactRoot, path_1.default.join(manifest.preview.rootPath, manifest.preview.entryPath));
|
|
46
|
+
for (const pointer of [manifest.tree, manifest.base, manifest.parent]) {
|
|
47
|
+
if (!pointer)
|
|
48
|
+
continue;
|
|
49
|
+
const resolved = await trees.resolveRef(projectPath, pointer.commitSha);
|
|
50
|
+
if (!resolved ||
|
|
51
|
+
('treeSha' in pointer && pointer.treeSha !== resolved.treeSha))
|
|
52
|
+
throw new Error(`Missing snapshot: ${pointer.commitSha}`);
|
|
53
|
+
await trees.retainSnapshot(projectPath, pointer.commitSha);
|
|
54
|
+
}
|
|
55
|
+
if (manifest.tree && manifest.serve?.kind === 'static') {
|
|
56
|
+
const extracted = await trees.extractToCache({
|
|
57
|
+
projectPath,
|
|
58
|
+
treeSha: manifest.tree.treeSha,
|
|
59
|
+
commitish: manifest.tree.commitSha,
|
|
60
|
+
});
|
|
61
|
+
await (0, importFiles_1.verifyArtifactFile)(extracted, manifest.serve.entryPath);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
/** Copies and verifies a quiescent source before publishing its durable bundle. */
|
|
65
|
+
const importProject = async ({ registry, projectId, }) => {
|
|
66
|
+
const project = registry.get(projectId);
|
|
67
|
+
const source = path_1.default.join(project.projectPath, '.rivet');
|
|
68
|
+
const nestedRoots = (0, historyRoots_1.nestedFreshSessionWorkdirs)(project.projectPath);
|
|
69
|
+
if (nestedRoots.length > 0) {
|
|
70
|
+
for (const projectPath of nestedRoots)
|
|
71
|
+
registry.attachHistoryRoot({ projectId, projectPath });
|
|
72
|
+
return {
|
|
73
|
+
status: 'deferred',
|
|
74
|
+
reason: 'This workspace contains nested project histories; they remain readable in their original locations',
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
if (!project.isAvailable)
|
|
78
|
+
return {
|
|
79
|
+
status: project.storageKind === 'bundle' ? 'current' : 'deferred',
|
|
80
|
+
reason: 'Workspace is unavailable',
|
|
81
|
+
};
|
|
82
|
+
if (RUNTIME_CHANNELS.some((channel) => sourceCanWrite(project.projectPath, channel)))
|
|
83
|
+
return {
|
|
84
|
+
status: 'deferred',
|
|
85
|
+
reason: 'A source runtime or opener may still write history',
|
|
86
|
+
};
|
|
87
|
+
const locks = [];
|
|
88
|
+
try {
|
|
89
|
+
for (const channel of RUNTIME_CHANNELS) {
|
|
90
|
+
const lock = (0, serverHandshake_1.acquireStartLock)(project.projectPath, channel);
|
|
91
|
+
if (!lock) {
|
|
92
|
+
return {
|
|
93
|
+
status: 'deferred',
|
|
94
|
+
reason: 'A project opener holds the startup lock',
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
locks.push(lock);
|
|
98
|
+
}
|
|
99
|
+
const hasWriter = RUNTIME_CHANNELS.some((channel) => {
|
|
100
|
+
const discovery = (0, serverHandshake_1.readHandshakeResult)(project.projectPath, channel);
|
|
101
|
+
return (discovery.status === 'invalid' ||
|
|
102
|
+
(discovery.status === 'found' && (0, pid_1.isPidAlive)(discovery.handshake.pid)));
|
|
103
|
+
});
|
|
104
|
+
if (hasWriter)
|
|
105
|
+
return { status: 'deferred', reason: 'Source runtime became available' };
|
|
106
|
+
const fingerprint = await (0, importFiles_1.sourceFingerprint)(source);
|
|
107
|
+
if (project.storageKind === 'bundle') {
|
|
108
|
+
return {
|
|
109
|
+
status: project.sourceFingerprint === fingerprint ? 'current' : 'diverged',
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
const destination = registry.bundleDirectory(projectId);
|
|
113
|
+
if (fs_1.default.existsSync(destination)) {
|
|
114
|
+
const receipt = JSON.parse(await promises_1.default.readFile(path_1.default.join(destination, RECEIPT_FILENAME), 'utf8'));
|
|
115
|
+
if (receipt.projectId !== projectId ||
|
|
116
|
+
receipt.sourceFingerprint !== fingerprint)
|
|
117
|
+
return {
|
|
118
|
+
status: 'diverged',
|
|
119
|
+
reason: 'An unpublished bundle differs from this source',
|
|
120
|
+
};
|
|
121
|
+
const metadata = await BundleMetadataStore_1.BundleMetadataStore.open({
|
|
122
|
+
directory: destination,
|
|
123
|
+
project,
|
|
124
|
+
});
|
|
125
|
+
try {
|
|
126
|
+
const trees = new TreeStore_1.TreeStore(new ProjectStorage_1.ProjectStorage([
|
|
127
|
+
{
|
|
128
|
+
projectPath: project.projectPath,
|
|
129
|
+
dataDirectory: destination,
|
|
130
|
+
cacheDirectory: path_1.default.join(registry.root, 'cache', projectId),
|
|
131
|
+
},
|
|
132
|
+
]));
|
|
133
|
+
const manifests = metadata.listVariants();
|
|
134
|
+
if (manifests.length !== (await (0, importFiles_1.readSourceManifests)(source)).length)
|
|
135
|
+
throw new Error('Incomplete published bundle');
|
|
136
|
+
for (const manifest of manifests) {
|
|
137
|
+
const relative = metadata.artifactPath(manifest.sessionId, manifest.variantId);
|
|
138
|
+
if (!relative)
|
|
139
|
+
throw new Error('Missing imported artifact path');
|
|
140
|
+
const artifactRoot = path_1.default.resolve(destination, relative);
|
|
141
|
+
if (!artifactRoot.startsWith(destination + path_1.default.sep))
|
|
142
|
+
throw new Error('Artifact escapes bundle');
|
|
143
|
+
await verifyImportedVariant({
|
|
144
|
+
manifest,
|
|
145
|
+
artifactRoot,
|
|
146
|
+
trees,
|
|
147
|
+
projectPath: project.projectPath,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
finally {
|
|
152
|
+
metadata.close();
|
|
153
|
+
}
|
|
154
|
+
registry.activateBundle({ projectId, sourceFingerprint: fingerprint });
|
|
155
|
+
return { status: 'imported' };
|
|
156
|
+
}
|
|
157
|
+
const stage = path_1.default.join(registry.root, 'staging', `${projectId}-${(0, crypto_1.randomUUID)()}`);
|
|
158
|
+
await promises_1.default.mkdir(stage, { recursive: true });
|
|
159
|
+
let metadata;
|
|
160
|
+
try {
|
|
161
|
+
const manifests = await (0, importFiles_1.readSourceManifests)(source);
|
|
162
|
+
const presentation = await (0, sourcePresentation_1.readSourcePresentation)(source);
|
|
163
|
+
await (0, importFiles_1.copySourceFiles)(source, stage);
|
|
164
|
+
await (0, importFiles_1.relocateContext)({
|
|
165
|
+
sourceDirectory: source,
|
|
166
|
+
stageDirectory: stage,
|
|
167
|
+
bundleDirectory: destination,
|
|
168
|
+
});
|
|
169
|
+
metadata = await BundleMetadataStore_1.BundleMetadataStore.open({ directory: stage, project });
|
|
170
|
+
const trees = new TreeStore_1.TreeStore(new ProjectStorage_1.ProjectStorage([
|
|
171
|
+
{
|
|
172
|
+
projectPath: project.projectPath,
|
|
173
|
+
dataDirectory: stage,
|
|
174
|
+
cacheDirectory: path_1.default.join(registry.root, 'cache', projectId),
|
|
175
|
+
},
|
|
176
|
+
]));
|
|
177
|
+
if (trees.hasStore(project.projectPath))
|
|
178
|
+
await trees.fsck(project.projectPath);
|
|
179
|
+
for (const manifest of manifests) {
|
|
180
|
+
const relative = path_1.default.join('variants', manifest.sessionId, manifest.variantId);
|
|
181
|
+
const artifactRoot = path_1.default.join(stage, relative);
|
|
182
|
+
await verifyImportedVariant({
|
|
183
|
+
manifest,
|
|
184
|
+
artifactRoot,
|
|
185
|
+
trees,
|
|
186
|
+
projectPath: project.projectPath,
|
|
187
|
+
});
|
|
188
|
+
metadata.upsertVariant(manifest, relative);
|
|
189
|
+
}
|
|
190
|
+
const sessions = new Set(manifests.map((manifest) => manifest.sessionId));
|
|
191
|
+
for (const sessionId of sessions) {
|
|
192
|
+
const sessionPath = path_1.default.join(stage, 'variants', sessionId, 'session.json');
|
|
193
|
+
if (!fs_1.default.existsSync(sessionPath))
|
|
194
|
+
continue;
|
|
195
|
+
const session = JSON.parse(await promises_1.default.readFile(sessionPath, 'utf8'));
|
|
196
|
+
if (session.schemaVersion !== 2 || session.sessionId !== sessionId)
|
|
197
|
+
throw new Error('Unsupported session metadata');
|
|
198
|
+
metadata.putSession(session);
|
|
199
|
+
}
|
|
200
|
+
if (presentation !== null)
|
|
201
|
+
metadata.setPresentation(JSON.parse(presentation));
|
|
202
|
+
if (metadata.listVariants().length !== manifests.length)
|
|
203
|
+
throw new Error('Imported history count does not match source');
|
|
204
|
+
metadata.close();
|
|
205
|
+
metadata = undefined;
|
|
206
|
+
if ((await (0, importFiles_1.sourceFingerprint)(source)) !== fingerprint)
|
|
207
|
+
throw new Error('Source history changed during import; retry after its writer stops');
|
|
208
|
+
await promises_1.default.writeFile(path_1.default.join(stage, RECEIPT_FILENAME), JSON.stringify({ projectId, sourceFingerprint: fingerprint }), { mode: 0o600 });
|
|
209
|
+
await promises_1.default.mkdir(path_1.default.dirname(destination), { recursive: true });
|
|
210
|
+
await promises_1.default.rename(stage, destination);
|
|
211
|
+
registry.activateBundle({ projectId, sourceFingerprint: fingerprint });
|
|
212
|
+
return { status: 'imported' };
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
metadata?.close();
|
|
216
|
+
await promises_1.default.rm(stage, { recursive: true, force: true });
|
|
217
|
+
throw error;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
finally {
|
|
221
|
+
for (const lock of locks)
|
|
222
|
+
lock.release();
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
exports.importProject = importProject;
|
|
226
|
+
//# sourceMappingURL=ProjectImport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectImport.js","sourceRoot":"","sources":["../../src/services/ProjectImport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { LibraryProject, ProjectLibrarySnapshot } from '../types/project-library';
|
|
2
|
+
import type { HubNavigationTarget } from './HubNavigation';
|
|
3
|
+
import { ProjectRegistry, type RegisteredProject } from './ProjectRegistry';
|
|
4
|
+
import { type ProjectImportResult } from './ProjectImport';
|
|
5
|
+
import { VariantHistoryService, type VariantHistoryEntry, type VariantHistoryDetail } from './VariantHistoryService';
|
|
6
|
+
export interface LibraryVariant extends VariantHistoryEntry {
|
|
7
|
+
projectId: string;
|
|
8
|
+
projectPath: string;
|
|
9
|
+
}
|
|
10
|
+
interface VariantReference {
|
|
11
|
+
projectId: string;
|
|
12
|
+
sessionId: string;
|
|
13
|
+
variantId: string;
|
|
14
|
+
}
|
|
15
|
+
/** Resolves the installation's library root, with explicit isolated roots for automation. */
|
|
16
|
+
export declare const currentLibraryRoot: (env?: NodeJS.ProcessEnv) => string;
|
|
17
|
+
/** Serves project-scoped saved history without starting application runtimes. */
|
|
18
|
+
export declare class ProjectLibrary {
|
|
19
|
+
readonly registry: ProjectRegistry;
|
|
20
|
+
private readonly owners;
|
|
21
|
+
readonly issues: Map<string, string>;
|
|
22
|
+
private isClosed;
|
|
23
|
+
private constructor();
|
|
24
|
+
/** Opens the project library independently of any selected workspace. */
|
|
25
|
+
static open(root?: string): Promise<ProjectLibrary>;
|
|
26
|
+
/** Registers an opened project and imports its quiescent supported history. */
|
|
27
|
+
prepare(projectPath: string): Promise<{
|
|
28
|
+
project: RegisteredProject;
|
|
29
|
+
migration: ProjectImportResult;
|
|
30
|
+
}>;
|
|
31
|
+
/** Relinks a working folder and refreshes its storage attachment. */
|
|
32
|
+
relink(args: {
|
|
33
|
+
projectId: string;
|
|
34
|
+
projectPath: string;
|
|
35
|
+
}): Promise<RegisteredProject>;
|
|
36
|
+
/** Closes cached metadata before changing the project's storage attachment. */
|
|
37
|
+
private invalidate;
|
|
38
|
+
/** Lists registered workspaces and known issues without opening saved history. */
|
|
39
|
+
listProjects(): LibraryProject[];
|
|
40
|
+
/** Builds the library view from saved history and current workspace availability. */
|
|
41
|
+
snapshot(): Promise<ProjectLibrarySnapshot>;
|
|
42
|
+
/** Applies metadata edits through the exact direction's authoritative history owner. */
|
|
43
|
+
updateVariant(args: VariantReference & {
|
|
44
|
+
label?: string;
|
|
45
|
+
status?: 'removed';
|
|
46
|
+
}): Promise<void>;
|
|
47
|
+
/** Verifies the selected project and saved direction before delivering navigation. */
|
|
48
|
+
assertNavigationTarget(target: HubNavigationTarget): Promise<void>;
|
|
49
|
+
/** Returns one shared history service for a project's persisted storage owner. */
|
|
50
|
+
history(projectId: string): Promise<VariantHistoryService>;
|
|
51
|
+
/** Registers a generated directory with the same history owner before generation writes. */
|
|
52
|
+
attachGeneratedRoot({ projectId, projectPath, }: {
|
|
53
|
+
projectId: string;
|
|
54
|
+
projectPath: string;
|
|
55
|
+
}): Promise<void>;
|
|
56
|
+
/** Lists one project's directions, including preserved generated history roots. */
|
|
57
|
+
private listProject;
|
|
58
|
+
/** Aggregates readable projects while retaining individual project availability errors. */
|
|
59
|
+
listVariants(projectId?: string): Promise<LibraryVariant[]>;
|
|
60
|
+
/** Resolves an exact reference together with the filesystem root that owns it. */
|
|
61
|
+
variant(reference: VariantReference): Promise<{
|
|
62
|
+
detail: VariantHistoryDetail;
|
|
63
|
+
projectPath: string;
|
|
64
|
+
history: VariantHistoryService;
|
|
65
|
+
} | null>;
|
|
66
|
+
/** Releases metadata connections; running project processes have separate lifetimes. */
|
|
67
|
+
close(): void;
|
|
68
|
+
/** Initializes one storage owner and shares it across concurrent library reads. */
|
|
69
|
+
private owner;
|
|
70
|
+
/** Attaches bundle metadata only when its registry activation is committed. */
|
|
71
|
+
private createOwner;
|
|
72
|
+
}
|
|
73
|
+
export {};
|
|
74
|
+
//# sourceMappingURL=ProjectLibrary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectLibrary.d.ts","sourceRoot":"","sources":["../../src/services/ProjectLibrary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EACvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAK3D,OAAO,EACL,eAAe,EAEf,KAAK,iBAAiB,EACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAI1E,OAAO,EACL,qBAAqB,EACrB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EAC1B,MAAM,yBAAyB,CAAC;AAGjC,MAAM,WAAW,cAAe,SAAQ,mBAAmB;IACzD,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAMD,UAAU,gBAAgB;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,6FAA6F;AAC7F,eAAO,MAAM,kBAAkB,GAC7B,MAAK,MAAM,CAAC,UAAwB,KACnC,MAKF,CAAC;AAEF,iFAAiF;AACjF,qBAAa,cAAc;IAIL,QAAQ,CAAC,QAAQ,EAAE,eAAe;IAHtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4C;IACnE,QAAQ,CAAC,MAAM,sBAA6B;IAC5C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO;IAEP,yEAAyE;WAC5D,IAAI,CAAC,IAAI,SAAuB,GAAG,OAAO,CAAC,cAAc,CAAC;IAIvE,+EAA+E;IACzE,OAAO,CACX,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;QAAE,OAAO,EAAE,iBAAiB,CAAC;QAAC,SAAS,EAAE,mBAAmB,CAAA;KAAE,CAAC;IAgC1E,qEAAqE;IAC/D,MAAM,CAAC,IAAI,EAAE;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAO9B,+EAA+E;YACjE,UAAU;IASxB,kFAAkF;IAClF,YAAY,IAAI,cAAc,EAAE;IAMhC,qFAAqF;IAC/E,QAAQ,IAAI,OAAO,CAAC,sBAAsB,CAAC;IAiBjD,wFAAwF;IAClF,aAAa,CACjB,IAAI,EAAE,gBAAgB,GAAG;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,SAAS,CAAA;KAAE,GAC9D,OAAO,CAAC,IAAI,CAAC;IAWhB,sFAAsF;IAChF,sBAAsB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAexE,kFAAkF;IAC5E,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAIhE,4FAA4F;IACtF,mBAAmB,CAAC,EACxB,SAAS,EACT,WAAW,GACZ,EAAE;QACD,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBjB,mFAAmF;YACrE,WAAW;IAuCzB,2FAA2F;IACrF,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAoBjE,kFAAkF;IAC5E,OAAO,CAAC,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAAC;QAClD,MAAM,EAAE,oBAAoB,CAAC;QAC7B,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,qBAAqB,CAAC;KAChC,GAAG,IAAI,CAAC;IAcT,wFAAwF;IACxF,KAAK,IAAI,IAAI;IAcb,mFAAmF;IACnF,OAAO,CAAC,KAAK;IASb,+EAA+E;YACjE,WAAW;CA4B1B"}
|
|
@@ -0,0 +1,261 @@
|
|
|
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.ProjectLibrary = exports.currentLibraryRoot = void 0;
|
|
7
|
+
const libraryErrors_1 = require("./libraryErrors");
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const installationChannel_1 = require("../install/installationChannel");
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const ProjectRegistry_1 = require("./ProjectRegistry");
|
|
12
|
+
const ProjectImport_1 = require("./ProjectImport");
|
|
13
|
+
const BundleMetadataStore_1 = require("../storage/library/BundleMetadataStore");
|
|
14
|
+
const ProjectStorage_1 = require("./ProjectStorage");
|
|
15
|
+
const TreeStore_1 = require("./TreeStore");
|
|
16
|
+
const VariantHistoryService_1 = require("./VariantHistoryService");
|
|
17
|
+
const historyRoots_1 = require("./historyRoots");
|
|
18
|
+
/** Resolves the installation's library root, with explicit isolated roots for automation. */
|
|
19
|
+
const currentLibraryRoot = (env = process.env) => {
|
|
20
|
+
const channel = (0, installationChannel_1.installationChannel)(env);
|
|
21
|
+
return env.RIVET_LIBRARY_ROOT
|
|
22
|
+
? path_1.default.resolve(env.RIVET_LIBRARY_ROOT)
|
|
23
|
+
: (0, ProjectRegistry_1.libraryRoot)({ channel });
|
|
24
|
+
};
|
|
25
|
+
exports.currentLibraryRoot = currentLibraryRoot;
|
|
26
|
+
/** Serves project-scoped saved history without starting application runtimes. */
|
|
27
|
+
class ProjectLibrary {
|
|
28
|
+
registry;
|
|
29
|
+
owners = new Map();
|
|
30
|
+
issues = new Map();
|
|
31
|
+
isClosed = false;
|
|
32
|
+
constructor(registry) {
|
|
33
|
+
this.registry = registry;
|
|
34
|
+
}
|
|
35
|
+
/** Opens the project library independently of any selected workspace. */
|
|
36
|
+
static async open(root = (0, exports.currentLibraryRoot)()) {
|
|
37
|
+
return new ProjectLibrary(await ProjectRegistry_1.ProjectRegistry.open(root));
|
|
38
|
+
}
|
|
39
|
+
/** Registers an opened project and imports its quiescent supported history. */
|
|
40
|
+
async prepare(projectPath) {
|
|
41
|
+
const project = this.registry.register({ projectPath });
|
|
42
|
+
for (const nested of (0, historyRoots_1.nestedFreshSessionWorkdirs)(project.projectPath))
|
|
43
|
+
this.registry.attachHistoryRoot({
|
|
44
|
+
projectId: project.id,
|
|
45
|
+
projectPath: nested,
|
|
46
|
+
});
|
|
47
|
+
let migration;
|
|
48
|
+
try {
|
|
49
|
+
migration = await (0, ProjectImport_1.importProject)({
|
|
50
|
+
registry: this.registry,
|
|
51
|
+
projectId: project.id,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
// Unimportable saved history never blocks opening the working folder;
|
|
56
|
+
// the project keeps its project-local storage and reports the failure.
|
|
57
|
+
migration = {
|
|
58
|
+
status: 'deferred',
|
|
59
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
if (project.storageKind !== this.registry.get(project.id).storageKind)
|
|
63
|
+
await this.invalidate(project.id);
|
|
64
|
+
if (migration.status === 'diverged' || migration.status === 'deferred')
|
|
65
|
+
this.issues.set(project.id, migration.reason ??
|
|
66
|
+
'Preserved source history differs from the imported bundle');
|
|
67
|
+
return { project: this.registry.get(project.id), migration };
|
|
68
|
+
}
|
|
69
|
+
/** Relinks a working folder and refreshes its storage attachment. */
|
|
70
|
+
async relink(args) {
|
|
71
|
+
const project = this.registry.relink(args);
|
|
72
|
+
await this.invalidate(project.id);
|
|
73
|
+
this.issues.delete(project.id);
|
|
74
|
+
return project;
|
|
75
|
+
}
|
|
76
|
+
/** Closes cached metadata before changing the project's storage attachment. */
|
|
77
|
+
async invalidate(projectId) {
|
|
78
|
+
const pending = this.owners.get(projectId);
|
|
79
|
+
this.owners.delete(projectId);
|
|
80
|
+
if (!pending)
|
|
81
|
+
return;
|
|
82
|
+
const owner = await pending;
|
|
83
|
+
owner.history.metadata.closeAll();
|
|
84
|
+
owner.bundle?.close();
|
|
85
|
+
}
|
|
86
|
+
/** Lists registered workspaces and known issues without opening saved history. */
|
|
87
|
+
listProjects() {
|
|
88
|
+
return this.registry
|
|
89
|
+
.list()
|
|
90
|
+
.map((project) => ({ ...project, issue: this.issues.get(project.id) }));
|
|
91
|
+
}
|
|
92
|
+
/** Builds the library view from saved history and current workspace availability. */
|
|
93
|
+
async snapshot() {
|
|
94
|
+
const variants = await this.listVariants();
|
|
95
|
+
return {
|
|
96
|
+
projects: this.listProjects(),
|
|
97
|
+
variants: variants.map(({ projectId, manifest, hasStaticPreview }) => ({
|
|
98
|
+
projectId,
|
|
99
|
+
sessionId: manifest.sessionId,
|
|
100
|
+
variantId: manifest.variantId,
|
|
101
|
+
label: manifest.label,
|
|
102
|
+
brief: manifest.brief,
|
|
103
|
+
createdAt: manifest.createdAt,
|
|
104
|
+
hasStaticPreview,
|
|
105
|
+
hasInteractivePreview: manifest.serve?.kind === 'dev-server',
|
|
106
|
+
})),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/** Applies metadata edits through the exact direction's authoritative history owner. */
|
|
110
|
+
async updateVariant(args) {
|
|
111
|
+
const found = await this.variant(args);
|
|
112
|
+
if (!found)
|
|
113
|
+
throw new libraryErrors_1.LibraryError('variant_not_found', 'Unknown saved direction');
|
|
114
|
+
const target = { ...args, projectPath: found.projectPath };
|
|
115
|
+
if (args.label !== undefined)
|
|
116
|
+
await found.history.renameVariant({ ...target, label: args.label });
|
|
117
|
+
if (args.status)
|
|
118
|
+
await found.history.markStatus({ ...target, status: args.status });
|
|
119
|
+
}
|
|
120
|
+
/** Verifies the selected project and saved direction before delivering navigation. */
|
|
121
|
+
async assertNavigationTarget(target) {
|
|
122
|
+
if (target.projectId)
|
|
123
|
+
this.registry.get(target.projectId);
|
|
124
|
+
if (target.projectId &&
|
|
125
|
+
target.sessionId &&
|
|
126
|
+
target.variantId &&
|
|
127
|
+
!(await this.variant({
|
|
128
|
+
projectId: target.projectId,
|
|
129
|
+
sessionId: target.sessionId,
|
|
130
|
+
variantId: target.variantId,
|
|
131
|
+
})))
|
|
132
|
+
throw new libraryErrors_1.LibraryError('variant_not_found', 'Unknown saved direction');
|
|
133
|
+
}
|
|
134
|
+
/** Returns one shared history service for a project's persisted storage owner. */
|
|
135
|
+
async history(projectId) {
|
|
136
|
+
return (await this.owner(projectId)).history;
|
|
137
|
+
}
|
|
138
|
+
/** Registers a generated directory with the same history owner before generation writes. */
|
|
139
|
+
async attachGeneratedRoot({ projectId, projectPath, }) {
|
|
140
|
+
fs_1.default.mkdirSync(projectPath, { recursive: true });
|
|
141
|
+
this.registry.attachHistoryRoot({ projectId, projectPath });
|
|
142
|
+
const owner = await this.owner(projectId);
|
|
143
|
+
if (!owner.bundle)
|
|
144
|
+
return;
|
|
145
|
+
const dataDirectory = this.registry.bundleDirectory(projectId);
|
|
146
|
+
for (const root of new Set([
|
|
147
|
+
path_1.default.resolve(projectPath),
|
|
148
|
+
fs_1.default.realpathSync(projectPath),
|
|
149
|
+
])) {
|
|
150
|
+
owner.storage.attach({
|
|
151
|
+
projectPath: root,
|
|
152
|
+
dataDirectory,
|
|
153
|
+
cacheDirectory: path_1.default.join(this.registry.root, 'cache', projectId),
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/** Lists one project's directions, including preserved generated history roots. */
|
|
158
|
+
async listProject(projectId) {
|
|
159
|
+
const project = this.registry.get(projectId);
|
|
160
|
+
if (!project.isAvailable && project.storageKind === 'project')
|
|
161
|
+
throw new Error('Working folder and project-local history are unavailable');
|
|
162
|
+
const history = await this.history(projectId);
|
|
163
|
+
const roots = project.storageKind === 'bundle'
|
|
164
|
+
? [project.projectPath]
|
|
165
|
+
: this.registry.historyRoots(projectId);
|
|
166
|
+
const entries = (await Promise.all(roots.map(async (projectPath) => (await history.listVariantsFromIndex({ projectPath })).map((entry) => ({ ...entry, projectId, projectPath }))))).flat();
|
|
167
|
+
const unique = new Map();
|
|
168
|
+
for (const entry of entries) {
|
|
169
|
+
if (entry.manifest.status === 'removed' ||
|
|
170
|
+
entry.manifest.status === 'cancelled')
|
|
171
|
+
continue;
|
|
172
|
+
const key = `${entry.manifest.sessionId}:${entry.manifest.variantId}`;
|
|
173
|
+
const existing = unique.get(key);
|
|
174
|
+
if (existing &&
|
|
175
|
+
JSON.stringify(existing.manifest) !== JSON.stringify(entry.manifest))
|
|
176
|
+
throw new Error('Conflicting history identities across attached roots');
|
|
177
|
+
unique.set(key, entry);
|
|
178
|
+
}
|
|
179
|
+
return [...unique.values()];
|
|
180
|
+
}
|
|
181
|
+
/** Aggregates readable projects while retaining individual project availability errors. */
|
|
182
|
+
async listVariants(projectId) {
|
|
183
|
+
if (projectId)
|
|
184
|
+
return this.listProject(projectId);
|
|
185
|
+
const projects = this.registry.list();
|
|
186
|
+
const results = await Promise.allSettled(projects.map((project) => this.listProject(project.id)));
|
|
187
|
+
return results
|
|
188
|
+
.flatMap((result, index) => {
|
|
189
|
+
if (result.status === 'fulfilled')
|
|
190
|
+
return result.value;
|
|
191
|
+
this.issues.set(projects[index].id, result.reason instanceof Error
|
|
192
|
+
? result.reason.message
|
|
193
|
+
: String(result.reason));
|
|
194
|
+
return [];
|
|
195
|
+
})
|
|
196
|
+
.sort((a, b) => b.manifest.createdAt.localeCompare(a.manifest.createdAt));
|
|
197
|
+
}
|
|
198
|
+
/** Resolves an exact reference together with the filesystem root that owns it. */
|
|
199
|
+
async variant(reference) {
|
|
200
|
+
const project = this.registry.get(reference.projectId);
|
|
201
|
+
const history = await this.history(project.id);
|
|
202
|
+
const roots = project.storageKind === 'bundle'
|
|
203
|
+
? [project.projectPath]
|
|
204
|
+
: this.registry.historyRoots(project.id);
|
|
205
|
+
for (const projectPath of roots) {
|
|
206
|
+
const detail = await history.getVariant({ ...reference, projectPath });
|
|
207
|
+
if (detail)
|
|
208
|
+
return { detail, projectPath, history };
|
|
209
|
+
}
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
/** Releases metadata connections; running project processes have separate lifetimes. */
|
|
213
|
+
close() {
|
|
214
|
+
if (this.isClosed)
|
|
215
|
+
return;
|
|
216
|
+
this.isClosed = true;
|
|
217
|
+
for (const owner of this.owners.values())
|
|
218
|
+
void owner.then((value) => {
|
|
219
|
+
value.history.metadata.closeAll();
|
|
220
|
+
value.bundle?.close();
|
|
221
|
+
}, () => undefined);
|
|
222
|
+
this.registry.close();
|
|
223
|
+
}
|
|
224
|
+
/** Initializes one storage owner and shares it across concurrent library reads. */
|
|
225
|
+
owner(projectId) {
|
|
226
|
+
const existing = this.owners.get(projectId);
|
|
227
|
+
if (existing)
|
|
228
|
+
return existing;
|
|
229
|
+
const pending = this.createOwner(projectId);
|
|
230
|
+
this.owners.set(projectId, pending);
|
|
231
|
+
void pending.catch(() => this.owners.delete(projectId));
|
|
232
|
+
return pending;
|
|
233
|
+
}
|
|
234
|
+
/** Attaches bundle metadata only when its registry activation is committed. */
|
|
235
|
+
async createOwner(projectId) {
|
|
236
|
+
const project = this.registry.get(projectId);
|
|
237
|
+
const storage = new ProjectStorage_1.ProjectStorage();
|
|
238
|
+
let bundle;
|
|
239
|
+
if (project.storageKind === 'bundle') {
|
|
240
|
+
const dataDirectory = this.registry.bundleDirectory(projectId);
|
|
241
|
+
if (!fs_1.default.existsSync(path_1.default.join(dataDirectory, 'metadata.sqlite')))
|
|
242
|
+
throw new Error('The saved project database is missing');
|
|
243
|
+
const roots = this.registry.historyRoots(projectId);
|
|
244
|
+
bundle = await BundleMetadataStore_1.BundleMetadataStore.open({
|
|
245
|
+
directory: dataDirectory,
|
|
246
|
+
project,
|
|
247
|
+
});
|
|
248
|
+
for (const projectPath of roots) {
|
|
249
|
+
storage.attach({
|
|
250
|
+
projectPath,
|
|
251
|
+
dataDirectory,
|
|
252
|
+
cacheDirectory: path_1.default.join(this.registry.root, 'cache', projectId),
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
const history = new VariantHistoryService_1.VariantHistoryService(new TreeStore_1.TreeStore(storage), undefined, { bundle });
|
|
257
|
+
return { history, storage, bundle };
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
exports.ProjectLibrary = ProjectLibrary;
|
|
261
|
+
//# sourceMappingURL=ProjectLibrary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectLibrary.js","sourceRoot":"","sources":["../../src/services/ProjectLibrary.ts"],"names":[],"mappings":"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"}
|