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