videobook-engine 2.0.1 → 4.2.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 +87 -41
- package/dist/artifact-names.d.ts +6 -0
- package/dist/artifact-names.d.ts.map +1 -0
- package/dist/artifact-names.js +56 -0
- package/dist/artifact-names.js.map +1 -0
- package/dist/artifacts.d.ts.map +1 -1
- package/dist/artifacts.js +57 -23
- package/dist/artifacts.js.map +1 -1
- package/dist/books.js +2 -1
- package/dist/books.js.map +1 -1
- package/dist/cas.d.ts +27 -1
- package/dist/cas.d.ts.map +1 -1
- package/dist/cas.js +78 -6
- package/dist/cas.js.map +1 -1
- package/dist/catalog-metadata.d.ts +56 -0
- package/dist/catalog-metadata.d.ts.map +1 -0
- package/dist/catalog-metadata.js +42 -0
- package/dist/catalog-metadata.js.map +1 -0
- package/dist/communications.js +4 -2
- package/dist/communications.js.map +1 -1
- package/dist/context.d.ts +6 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +35 -6
- package/dist/context.js.map +1 -1
- package/dist/domain.d.ts +4 -0
- package/dist/domain.d.ts.map +1 -1
- package/dist/domain.js +870 -58
- package/dist/domain.js.map +1 -1
- package/dist/edit-policy.d.ts +3 -0
- package/dist/edit-policy.d.ts.map +1 -0
- package/dist/edit-policy.js +6 -0
- package/dist/edit-policy.js.map +1 -0
- package/dist/edits.d.ts +10 -0
- package/dist/edits.d.ts.map +1 -0
- package/dist/edits.js +1392 -0
- package/dist/edits.js.map +1 -0
- package/dist/engine-types.d.ts +110 -60
- package/dist/engine-types.d.ts.map +1 -1
- package/dist/engine-types.js +33 -0
- package/dist/engine-types.js.map +1 -1
- package/dist/engine.d.ts +69 -8
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +24 -18
- package/dist/engine.js.map +1 -1
- package/dist/files.d.ts.map +1 -1
- package/dist/files.js +31 -27
- package/dist/files.js.map +1 -1
- package/dist/fork.d.ts +147 -0
- package/dist/fork.d.ts.map +1 -0
- package/dist/fork.js +609 -0
- package/dist/fork.js.map +1 -0
- package/dist/history.d.ts +0 -4
- package/dist/history.d.ts.map +1 -1
- package/dist/history.js +166 -595
- package/dist/history.js.map +1 -1
- package/dist/index.d.ts +16 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/dist/job-queue.d.ts +2 -0
- package/dist/job-queue.d.ts.map +1 -1
- package/dist/job-queue.js +29 -2
- package/dist/job-queue.js.map +1 -1
- package/dist/media.d.ts.map +1 -1
- package/dist/media.js +1 -0
- package/dist/media.js.map +1 -1
- package/dist/merge-policy.d.ts +99 -0
- package/dist/merge-policy.d.ts.map +1 -0
- package/dist/merge-policy.js +310 -0
- package/dist/merge-policy.js.map +1 -0
- package/dist/metadata.d.ts.map +1 -1
- package/dist/metadata.js +15 -20
- package/dist/metadata.js.map +1 -1
- package/dist/migration.d.ts +9 -0
- package/dist/migration.d.ts.map +1 -0
- package/dist/migration.js +534 -0
- package/dist/migration.js.map +1 -0
- package/dist/mvp-contract-fixtures.d.ts +244 -0
- package/dist/mvp-contract-fixtures.d.ts.map +1 -0
- package/dist/mvp-contract-fixtures.js +556 -0
- package/dist/mvp-contract-fixtures.js.map +1 -0
- package/dist/mvp-contracts.d.ts +761 -0
- package/dist/mvp-contracts.d.ts.map +1 -0
- package/dist/mvp-contracts.js +59 -0
- package/dist/mvp-contracts.js.map +1 -0
- package/dist/mvp-time.d.ts +54 -0
- package/dist/mvp-time.d.ts.map +1 -0
- package/dist/mvp-time.js +148 -0
- package/dist/mvp-time.js.map +1 -0
- package/dist/notebook/types.d.ts +113 -8
- package/dist/notebook/types.d.ts.map +1 -1
- package/dist/order-keys.d.ts +22 -0
- package/dist/order-keys.d.ts.map +1 -0
- package/dist/order-keys.js +262 -0
- package/dist/order-keys.js.map +1 -0
- package/dist/runtime-services.js +4 -2
- package/dist/runtime-services.js.map +1 -1
- package/dist/schema.d.ts +24 -5
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +644 -132
- package/dist/schema.js.map +1 -1
- package/dist/search-benchmark.d.ts +4 -0
- package/dist/search-benchmark.d.ts.map +1 -0
- package/dist/search-benchmark.js +144 -0
- package/dist/search-benchmark.js.map +1 -0
- package/dist/sequences.d.ts +20 -0
- package/dist/sequences.d.ts.map +1 -0
- package/dist/sequences.js +825 -0
- package/dist/sequences.js.map +1 -0
- package/dist/similarity.js +1 -1
- package/dist/storage.d.ts +3 -1
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +388 -7
- package/dist/storage.js.map +1 -1
- package/dist/store.d.ts +63 -2
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +351 -65
- package/dist/store.js.map +1 -1
- package/dist/streams.d.ts +10 -0
- package/dist/streams.d.ts.map +1 -0
- package/dist/streams.js +183 -0
- package/dist/streams.js.map +1 -0
- package/dist/temporal-models.d.ts +48 -0
- package/dist/temporal-models.d.ts.map +1 -0
- package/dist/temporal-models.js +278 -0
- package/dist/temporal-models.js.map +1 -0
- package/dist/temporal-search.d.ts +29 -0
- package/dist/temporal-search.d.ts.map +1 -0
- package/dist/temporal-search.js +1507 -0
- package/dist/temporal-search.js.map +1 -0
- package/dist/transcripts.d.ts +16 -0
- package/dist/transcripts.d.ts.map +1 -0
- package/dist/transcripts.js +519 -0
- package/dist/transcripts.js.map +1 -0
- package/docs/engine-layout.md +346 -106
- package/docs/mvp-prd.md +918 -0
- package/fixtures/media/vancat.mp4 +0 -0
- package/fixtures/media/vancat_profile.jpg +0 -0
- package/fixtures/v5/contract-fixtures.json +1532 -0
- package/package.json +30 -5
- package/dist/history-types.d.ts +0 -74
- package/dist/history-types.d.ts.map +0 -1
- package/dist/history-types.js +0 -2
- package/dist/history-types.js.map +0 -1
- package/dist/timeline.d.ts +0 -9
- package/dist/timeline.d.ts.map +0 -1
- package/dist/timeline.js +0 -236
- package/dist/timeline.js.map +0 -1
package/dist/fork.js
ADDED
|
@@ -0,0 +1,609 @@
|
|
|
1
|
+
import { copyFile, mkdir, mkdtemp, rm } from "node:fs/promises";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
import { DatabaseSync } from "@dolthub/doltlite";
|
|
5
|
+
import { v7 as uuidv7 } from "uuid";
|
|
6
|
+
import { ObjectStore } from "./cas.js";
|
|
7
|
+
import { createEngine } from "./engine.js";
|
|
8
|
+
import { assertSameSchemaVersion, findSlugConflicts, reconcileSingletonFlags, verifyConstraintHealth, } from "./merge-policy.js";
|
|
9
|
+
import { SEMANTIC_TABLES } from "./schema.js";
|
|
10
|
+
import { canonicalJson, EngineFault } from "./store.js";
|
|
11
|
+
const DEFAULT_MERGE_AUTHOR = "Videobook <videobook@localhost>";
|
|
12
|
+
/**
|
|
13
|
+
* Bootstraps a fork: clones the upstream catalog into a new local engine
|
|
14
|
+
* root and opens it as a normal engine. The fork is a full citizen from
|
|
15
|
+
* there — it commits on its own main, backs up to its own catalog remote,
|
|
16
|
+
* and reads upstream objects lazily through its configured `ContentStore`.
|
|
17
|
+
* It never pulls; integration is the merge-back flow's job.
|
|
18
|
+
*/
|
|
19
|
+
export async function bootstrapFork(options) {
|
|
20
|
+
if ((options.snapshotPath === undefined) ===
|
|
21
|
+
(options.upstreamUrl === undefined)) {
|
|
22
|
+
throw new EngineFault({
|
|
23
|
+
code: "INVALID_INPUT",
|
|
24
|
+
message: "Exactly one of snapshotPath or upstreamUrl is required",
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
const dataDir = path.resolve(options.dataDir);
|
|
28
|
+
const databasePath = path.join(dataDir, "videobook.db");
|
|
29
|
+
await mkdir(dataDir, { recursive: true });
|
|
30
|
+
if (options.snapshotPath !== undefined) {
|
|
31
|
+
await copyFile(options.snapshotPath, databasePath);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
const db = new DatabaseSync(databasePath);
|
|
35
|
+
try {
|
|
36
|
+
db.prepare("SELECT dolt_clone(?) AS result").get(options.upstreamUrl);
|
|
37
|
+
// ve-wsu: dolt_clone of a full engine catalog yields a database whose
|
|
38
|
+
// schema does not even parse (invalid rootpage on a secondary
|
|
39
|
+
// autoindex). Validate before handing the catalog to the engine.
|
|
40
|
+
db.prepare("SELECT COUNT(*) AS count FROM sqlite_master").get();
|
|
41
|
+
db.close();
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
try {
|
|
45
|
+
db.close();
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// The clone is already unusable; ignore close errors.
|
|
49
|
+
}
|
|
50
|
+
await rm(databasePath, { force: true });
|
|
51
|
+
throw new EngineFault({
|
|
52
|
+
code: "FEATURE_UNAVAILABLE",
|
|
53
|
+
message: "dolt_clone produced a corrupt catalog (upstream doltlite bug " +
|
|
54
|
+
"ve-wsu: multi-table working-set materialization drops index " +
|
|
55
|
+
"rootpages). Bootstrap from a snapshot of the upstream database " +
|
|
56
|
+
"with snapshotPath instead.",
|
|
57
|
+
details: {
|
|
58
|
+
cause: error instanceof Error ? error.message : String(error),
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return createEngine({
|
|
64
|
+
dataDir,
|
|
65
|
+
workspaceDir: path.resolve(options.workspaceDir),
|
|
66
|
+
...(options.remoteObjects ? { remoteObjects: options.remoteObjects } : {}),
|
|
67
|
+
...(options.objectPrefix ? { objectPrefix: options.objectPrefix } : {}),
|
|
68
|
+
...(options.catalogBackup ? { catalogBackup: options.catalogBackup } : {}),
|
|
69
|
+
...(options.identity ? { identity: options.identity } : {}),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Integrates a fork back into upstream main.
|
|
74
|
+
*
|
|
75
|
+
* Runs entirely in a throwaway copy of the upstream catalog inside a temp
|
|
76
|
+
* directory: fetches the fork, merges under the engine merge policy
|
|
77
|
+
* (same-schema precondition, user-facing slug conflicts, constraint
|
|
78
|
+
* verification, deterministic singleton reconcile), uploads the fork's new
|
|
79
|
+
* objects to the upstream object store BEFORE the catalog ref moves — the
|
|
80
|
+
* same objects-before-push ordering as engine.storage.backup — lands one
|
|
81
|
+
* forward integration commit on main, and pushes it.
|
|
82
|
+
*
|
|
83
|
+
* The caller's open engines are never touched: the upstream database file
|
|
84
|
+
* is only read (copied), and the fork is only fetched from. Conflicts and
|
|
85
|
+
* violations surface as the typed MERGE_CONFLICT / MERGE_VIOLATION /
|
|
86
|
+
* SCHEMA_INCOMPATIBLE errors from src/merge-policy.ts.
|
|
87
|
+
*/
|
|
88
|
+
export async function mergeBack(options) {
|
|
89
|
+
const workDir = options.workDir ??
|
|
90
|
+
(await mkdtemp(path.join(tmpdir(), "videobook-merge-back-")));
|
|
91
|
+
await mkdir(workDir, { recursive: true });
|
|
92
|
+
try {
|
|
93
|
+
const result = await mergeBackIn(workDir, options);
|
|
94
|
+
if (options.keepWorkDir)
|
|
95
|
+
result.workDir = workDir;
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
if (!options.keepWorkDir) {
|
|
100
|
+
await rm(workDir, { recursive: true, force: true });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async function mergeBackIn(workDir, options) {
|
|
105
|
+
const forkRemoteName = options.forkRemote.name ?? "fork";
|
|
106
|
+
const forkBranch = options.forkBranch ?? "main";
|
|
107
|
+
const theirsRef = `${forkRemoteName}/${forkBranch}`;
|
|
108
|
+
const localForkRef = `merge-back-${forkRemoteName}-${forkBranch}`;
|
|
109
|
+
await copyFile(options.upstreamDbPath, path.join(workDir, "videobook.db"));
|
|
110
|
+
const db = new DatabaseSync(path.join(workDir, "videobook.db"));
|
|
111
|
+
try {
|
|
112
|
+
const upstreamRemote = options.upstreamRemote ?? findRemote(db, "origin");
|
|
113
|
+
if (!upstreamRemote) {
|
|
114
|
+
throw new EngineFault({
|
|
115
|
+
code: "INVALID_INPUT",
|
|
116
|
+
message: "No upstream remote given and the catalog has no origin remote; " +
|
|
117
|
+
"pass upstreamRemote",
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
ensureRemote(db, upstreamRemote.name, upstreamRemote.url);
|
|
121
|
+
ensureRemote(db, forkRemoteName, options.forkRemote.url);
|
|
122
|
+
try {
|
|
123
|
+
db.prepare("SELECT dolt_fetch(?) AS result").get(forkRemoteName);
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
throw new EngineFault({
|
|
127
|
+
code: "OFFLINE",
|
|
128
|
+
message: `Could not fetch fork remote ${forkRemoteName}: ` +
|
|
129
|
+
(error instanceof Error ? error.message : String(error)),
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
// Resolve commit hashes (doltHashOf returns content hashes, not commit
|
|
133
|
+
// hashes): main's head comes from the log, and the fetched
|
|
134
|
+
// remote-tracking ref gets a local branch pointer — a ref-only write
|
|
135
|
+
// that materializes no working set, so it is safe under ve-wsu.
|
|
136
|
+
const oursRevision = db.doltLog({ limit: 1 })[0]?.commit_hash ?? "";
|
|
137
|
+
if (db.doltBranches().some((branch) => branch.name === localForkRef)) {
|
|
138
|
+
db.prepare("SELECT dolt_branch('-D', ?) AS result").get(localForkRef);
|
|
139
|
+
}
|
|
140
|
+
db.doltBranch(localForkRef, theirsRef);
|
|
141
|
+
const theirsRevision = db.doltBranches().find((branch) => branch.name === localForkRef)?.hash ??
|
|
142
|
+
"";
|
|
143
|
+
if (!oursRevision || !theirsRevision) {
|
|
144
|
+
throw new EngineFault({
|
|
145
|
+
code: "STORAGE_ERROR",
|
|
146
|
+
message: `Could not resolve merge heads for main and ${theirsRef}`,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
const baseRow = db
|
|
150
|
+
.prepare("SELECT dolt_merge_base(?, ?) AS hash")
|
|
151
|
+
.get("main", localForkRef);
|
|
152
|
+
const baseRevision = baseRow?.hash ?? null;
|
|
153
|
+
if (!baseRevision) {
|
|
154
|
+
throw new EngineFault({
|
|
155
|
+
code: "MERGE_CONFLICT",
|
|
156
|
+
message: `Merge-back of ${theirsRef} refused: no common ancestor with ` +
|
|
157
|
+
"upstream main (not a fork of this catalog?)",
|
|
158
|
+
details: { branch: theirsRef },
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
// The fork objects upstream lacks are uploaded before the catalog ref
|
|
162
|
+
// moves, whether or not a new integration commit is needed.
|
|
163
|
+
const newObjects = objectsAddedByFork(db, "HEAD", localForkRef);
|
|
164
|
+
let integrationCommit = oursRevision;
|
|
165
|
+
let reconciled = { transcripts: 0, sequences: 0 };
|
|
166
|
+
let alreadyIntegrated = baseRevision === theirsRevision || oursRevision === theirsRevision;
|
|
167
|
+
if (!alreadyIntegrated) {
|
|
168
|
+
const integration = integrate(db, localForkRef, theirsRef, {
|
|
169
|
+
baseRevision,
|
|
170
|
+
oursRevision,
|
|
171
|
+
theirsRevision,
|
|
172
|
+
forkRemote: `${forkRemoteName}:${options.forkRemote.url}`,
|
|
173
|
+
forkBranch,
|
|
174
|
+
author: options.author ?? DEFAULT_MERGE_AUTHOR,
|
|
175
|
+
});
|
|
176
|
+
if (integration === null) {
|
|
177
|
+
alreadyIntegrated = true;
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
integrationCommit = integration.commit;
|
|
181
|
+
reconciled = integration.reconciled;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
const uploadedObjects = await uploadForkObjects(db, newObjects, options);
|
|
185
|
+
try {
|
|
186
|
+
db.prepare("SELECT dolt_push(?, 'main') AS result").get(upstreamRemote.name);
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
190
|
+
if (/diverg|fast-forward|fetch first/i.test(message)) {
|
|
191
|
+
throw new EngineFault({
|
|
192
|
+
code: "DIVERGED",
|
|
193
|
+
message: "Upstream moved while the merge-back was in flight; re-run " +
|
|
194
|
+
`mergeBack against the moved upstream. (${message})`,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
throw error;
|
|
198
|
+
}
|
|
199
|
+
return {
|
|
200
|
+
integrationCommit,
|
|
201
|
+
baseRevision,
|
|
202
|
+
oursRevision,
|
|
203
|
+
theirsRevision,
|
|
204
|
+
alreadyIntegrated,
|
|
205
|
+
uploadedObjects,
|
|
206
|
+
reconciledTranscripts: reconciled.transcripts,
|
|
207
|
+
reconciledSequences: reconciled.sequences,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
finally {
|
|
211
|
+
db.close();
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Merges `theirsRef` into main under the engine merge policy and Dolt-
|
|
216
|
+
* commits the result as one forward integration commit. The policy wrapper
|
|
217
|
+
* is identical to `mergeWithPolicy` (same-schema precondition, slug
|
|
218
|
+
* conflicts as user-facing MERGE_CONFLICT, constraint verification,
|
|
219
|
+
* deterministic singleton-flag reconcile); only the merge mechanism
|
|
220
|
+
* differs — a projection-level three-way merge instead of `dolt_merge`,
|
|
221
|
+
* which ve-wsu makes unusable on full engine catalogs (see the module
|
|
222
|
+
* comment). Returns null when the fork's net changes are already present
|
|
223
|
+
* on main, in which case nothing is written or committed.
|
|
224
|
+
*/
|
|
225
|
+
function integrate(db, forkRef, displayRef, context) {
|
|
226
|
+
assertSameSchemaVersion(db, "HEAD", forkRef);
|
|
227
|
+
const slugConflicts = findSlugConflicts(db, "HEAD", forkRef);
|
|
228
|
+
if (slugConflicts.length > 0) {
|
|
229
|
+
throw new EngineFault({
|
|
230
|
+
code: "MERGE_CONFLICT",
|
|
231
|
+
message: `Merge-back of ${displayRef} conflicts on artifact slug(s): ` +
|
|
232
|
+
slugConflicts.map((conflict) => conflict.slug).join(", "),
|
|
233
|
+
details: { branch: displayRef, slugConflicts },
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
const merge = mergeRefs(db, "HEAD", forkRef, context.baseRevision);
|
|
237
|
+
if (!merge) {
|
|
238
|
+
// The fork's net changes are already present on main (for example a
|
|
239
|
+
// re-run after an earlier integration commit): nothing to commit.
|
|
240
|
+
return null;
|
|
241
|
+
}
|
|
242
|
+
const reconciled = reconcileSingletonFlags(db);
|
|
243
|
+
verifyConstraintHealth(db);
|
|
244
|
+
for (const table of SEMANTIC_TABLES) {
|
|
245
|
+
db.prepare("SELECT dolt_add(?) AS result").get(table);
|
|
246
|
+
}
|
|
247
|
+
const operationId = uuidv7();
|
|
248
|
+
// The write-set trailer names every resource the integration rewrote, so
|
|
249
|
+
// edit conflict detection (revisionConflicts in src/edits.ts) sees
|
|
250
|
+
// integrated changes exactly like locally committed ones. Oversized sets
|
|
251
|
+
// degrade the same way as engine commits: an omitted marker.
|
|
252
|
+
const writeSetJson = canonicalJson([...merge.writeSet].sort());
|
|
253
|
+
const writeSetTrailer = Buffer.byteLength(writeSetJson, "utf8") <= 32_000
|
|
254
|
+
? `write-set: ${writeSetJson}`
|
|
255
|
+
: `write-set-omitted: ${Buffer.byteLength(writeSetJson, "utf8")}`;
|
|
256
|
+
const message = [
|
|
257
|
+
"merge_back",
|
|
258
|
+
"",
|
|
259
|
+
`op-id: ${operationId}`,
|
|
260
|
+
`base-revision: ${context.baseRevision}`,
|
|
261
|
+
`merged-revision: ${context.theirsRevision}`,
|
|
262
|
+
writeSetTrailer,
|
|
263
|
+
`details: ${canonicalJson({
|
|
264
|
+
forkRemote: context.forkRemote,
|
|
265
|
+
forkBranch: context.forkBranch,
|
|
266
|
+
oursRevision: context.oursRevision,
|
|
267
|
+
})}`,
|
|
268
|
+
].join("\n");
|
|
269
|
+
const row = db
|
|
270
|
+
.prepare("SELECT dolt_commit('-m', ?, '--author', ?) AS hash")
|
|
271
|
+
.get(message, context.author);
|
|
272
|
+
if (!row?.hash) {
|
|
273
|
+
throw new EngineFault({
|
|
274
|
+
code: "STORAGE_ERROR",
|
|
275
|
+
message: "Dolt commit did not return a revision hash",
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
return { commit: row.hash, reconciled };
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Projection-level three-way merge: rewrites the working set of every
|
|
282
|
+
* semantic table to the row-level three-way merge of `oursRef` and
|
|
283
|
+
* `theirsRef` against `baseRef`. Row semantics mirror Dolt's merge: a row
|
|
284
|
+
* changed on only one side takes that side's value, identical changes
|
|
285
|
+
* resolve to the same row, and incompatible changes (both sides changed a
|
|
286
|
+
* row differently, or one side modified a row the other deleted) are
|
|
287
|
+
* conflicts and abort before anything is written. Same-row-different-slug
|
|
288
|
+
* situations reachable here are already covered by findSlugConflicts; this
|
|
289
|
+
* layer is the backstop for every other table.
|
|
290
|
+
*
|
|
291
|
+
* The rewrite reuses the restore idiom (src/history.ts
|
|
292
|
+
* reloadSemanticTables): `SEMANTIC_TABLES` is ordered parent-before-child,
|
|
293
|
+
* so deleting in reverse and reinserting in forward order satisfies foreign
|
|
294
|
+
* keys, and columns come from `PRAGMA table_info`.
|
|
295
|
+
*
|
|
296
|
+
* Returns whether the merge changed anything relative to `oursRef`; when
|
|
297
|
+
* it did not, the working set is left untouched.
|
|
298
|
+
*/
|
|
299
|
+
function mergeRefs(db, oursRef, theirsRef, baseRef) {
|
|
300
|
+
const shapes = SEMANTIC_TABLES.map((table) => tableShape(db, table));
|
|
301
|
+
const merged = [];
|
|
302
|
+
const conflicts = [];
|
|
303
|
+
const writeSet = new Set();
|
|
304
|
+
let changed = false;
|
|
305
|
+
for (const shape of shapes) {
|
|
306
|
+
const base = rowsByKey(db, shape, baseRef);
|
|
307
|
+
const ours = rowsByKey(db, shape, oursRef);
|
|
308
|
+
const theirs = rowsByKey(db, shape, theirsRef);
|
|
309
|
+
const result = new Map(ours);
|
|
310
|
+
const keys = new Set([...base.keys(), ...theirs.keys()]);
|
|
311
|
+
const applyRow = (key, row) => {
|
|
312
|
+
result.set(key, row);
|
|
313
|
+
changed = true;
|
|
314
|
+
resourcesFor(shape, row).forEach((resource) => writeSet.add(resource));
|
|
315
|
+
};
|
|
316
|
+
for (const key of keys) {
|
|
317
|
+
const b = base.get(key);
|
|
318
|
+
const o = ours.get(key);
|
|
319
|
+
const t = theirs.get(key);
|
|
320
|
+
if (t !== undefined && b === undefined) {
|
|
321
|
+
// Added on theirs.
|
|
322
|
+
if (o !== undefined && !rowsEqual(o, t)) {
|
|
323
|
+
const resolved = resolveObjectsRow(shape, o, t);
|
|
324
|
+
if (resolved) {
|
|
325
|
+
if (!rowsEqual(resolved, o))
|
|
326
|
+
applyRow(key, resolved);
|
|
327
|
+
}
|
|
328
|
+
else {
|
|
329
|
+
conflicts.push({
|
|
330
|
+
table: shape.table,
|
|
331
|
+
key: keyObject(shape, key),
|
|
332
|
+
reason: "row added with different content on both sides",
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
else if (o === undefined) {
|
|
337
|
+
applyRow(key, t);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
else if (t === undefined && b !== undefined) {
|
|
341
|
+
// Deleted on theirs.
|
|
342
|
+
if (o !== undefined && !rowsEqual(o, b)) {
|
|
343
|
+
conflicts.push({
|
|
344
|
+
table: shape.table,
|
|
345
|
+
key: keyObject(shape, key),
|
|
346
|
+
reason: "row modified on ours but deleted on theirs",
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
else if (o !== undefined) {
|
|
350
|
+
result.delete(key);
|
|
351
|
+
changed = true;
|
|
352
|
+
resourcesFor(shape, o).forEach((resource) => writeSet.add(resource));
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
else if (t !== undefined && b !== undefined && !rowsEqual(t, b)) {
|
|
356
|
+
// Changed on theirs.
|
|
357
|
+
if (o === undefined) {
|
|
358
|
+
conflicts.push({
|
|
359
|
+
table: shape.table,
|
|
360
|
+
key: keyObject(shape, key),
|
|
361
|
+
reason: "row modified on theirs but deleted on ours",
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
else if (rowsEqual(o, b) || rowsEqual(o, t)) {
|
|
365
|
+
if (!rowsEqual(o, t))
|
|
366
|
+
applyRow(key, t);
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
const resolved = resolveObjectsRow(shape, o, t);
|
|
370
|
+
if (resolved) {
|
|
371
|
+
if (!rowsEqual(resolved, o))
|
|
372
|
+
applyRow(key, resolved);
|
|
373
|
+
}
|
|
374
|
+
else {
|
|
375
|
+
conflicts.push({
|
|
376
|
+
table: shape.table,
|
|
377
|
+
key: keyObject(shape, key),
|
|
378
|
+
reason: "row modified differently on both sides",
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
merged.push({ shape, rows: [...result.values()] });
|
|
385
|
+
}
|
|
386
|
+
if (conflicts.length > 0) {
|
|
387
|
+
throw new EngineFault({
|
|
388
|
+
code: "MERGE_CONFLICT",
|
|
389
|
+
message: `Merge-back has row-level conflicts in ${conflicts.length} row(s) ` +
|
|
390
|
+
`across ${new Set(conflicts.map((c) => c.table)).size} table(s): ` +
|
|
391
|
+
conflicts
|
|
392
|
+
.slice(0, 5)
|
|
393
|
+
.map((c) => `${c.table}(${JSON.stringify(c.key)})`)
|
|
394
|
+
.join(", ") +
|
|
395
|
+
(conflicts.length > 5 ? ", …" : ""),
|
|
396
|
+
details: { conflicts },
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
if (!changed)
|
|
400
|
+
return null;
|
|
401
|
+
db.exec("PRAGMA foreign_keys = OFF");
|
|
402
|
+
try {
|
|
403
|
+
for (const { shape } of [...merged].reverse()) {
|
|
404
|
+
db.prepare(`DELETE FROM ${shape.table}`).run();
|
|
405
|
+
}
|
|
406
|
+
for (const { shape, rows } of merged) {
|
|
407
|
+
if (rows.length === 0)
|
|
408
|
+
continue;
|
|
409
|
+
const insert = db.prepare(`INSERT INTO ${shape.table}(${shape.columns.join(", ")})
|
|
410
|
+
VALUES (${shape.columns.map(() => "?").join(", ")})`);
|
|
411
|
+
for (const row of rows) {
|
|
412
|
+
insert.run(...shape.columns.map((column) => row[column] ?? null));
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
finally {
|
|
417
|
+
db.exec("PRAGMA foreign_keys = ON");
|
|
418
|
+
}
|
|
419
|
+
return { writeSet };
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* `objects` rows merge instead of conflicting when both sides agree on
|
|
423
|
+
* everything except `forgotten_at`: a forget on either side wins (deleted
|
|
424
|
+
* bytes must stay deleted on both lineages), and when both sides forgot
|
|
425
|
+
* independently the earlier wall-clock stamp is kept so the same takedown
|
|
426
|
+
* applied on fork and upstream cannot wedge integration. Returns null for
|
|
427
|
+
* any other table or any other difference.
|
|
428
|
+
*/
|
|
429
|
+
function resolveObjectsRow(shape, ours, theirs) {
|
|
430
|
+
if (shape.table !== "objects")
|
|
431
|
+
return null;
|
|
432
|
+
const keys = new Set([...Object.keys(ours), ...Object.keys(theirs)]);
|
|
433
|
+
for (const key of keys) {
|
|
434
|
+
if (key === "forgotten_at")
|
|
435
|
+
continue;
|
|
436
|
+
if (comparable(ours[key]) !== comparable(theirs[key]))
|
|
437
|
+
return null;
|
|
438
|
+
}
|
|
439
|
+
const oursForgotten = ours["forgotten_at"];
|
|
440
|
+
const theirsForgotten = theirs["forgotten_at"];
|
|
441
|
+
const forgotten = oursForgotten != null && theirsForgotten != null
|
|
442
|
+
? Math.min(oursForgotten, theirsForgotten)
|
|
443
|
+
: (oursForgotten ?? theirsForgotten ?? null);
|
|
444
|
+
return { ...ours, forgotten_at: forgotten };
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* Resource strings for the integration commit's write-set trailer, using
|
|
448
|
+
* the same vocabulary as engine write sets (src/edits.ts editWriteSet,
|
|
449
|
+
* storage/artifact operations) so overlap detection matches.
|
|
450
|
+
*/
|
|
451
|
+
function resourcesFor(shape, row) {
|
|
452
|
+
const value = (column) => String(row[column] ?? "");
|
|
453
|
+
switch (shape.table) {
|
|
454
|
+
case "sequences":
|
|
455
|
+
return [`sequence:${value("sequence_id")}`];
|
|
456
|
+
case "sequence_tracks":
|
|
457
|
+
return [`sequence:${value("sequence_id")}`, `track:${value("track_id")}`];
|
|
458
|
+
case "sequence_clips":
|
|
459
|
+
return [`clip:${value("clip_id")}`, `track:${value("track_id")}`];
|
|
460
|
+
case "clip_links":
|
|
461
|
+
case "clip_transforms":
|
|
462
|
+
return [`clip:${value("clip_id")}`];
|
|
463
|
+
case "transitions":
|
|
464
|
+
return [`transition:${value("transition_id")}`];
|
|
465
|
+
case "caption_cues":
|
|
466
|
+
return [`track:${value("track_id")}`];
|
|
467
|
+
case "artifacts":
|
|
468
|
+
return [`artifact:${value("artifact_id")}`];
|
|
469
|
+
case "artifact_files":
|
|
470
|
+
case "artifact_streams":
|
|
471
|
+
case "artifact_metadata":
|
|
472
|
+
case "audio_waveforms":
|
|
473
|
+
return [`artifact:${value("artifact_id")}`];
|
|
474
|
+
case "objects":
|
|
475
|
+
return [`object:${value("object_hash")}`];
|
|
476
|
+
case "transcripts":
|
|
477
|
+
return [`transcript:${value("transcript_id")}`];
|
|
478
|
+
case "transcript_segments":
|
|
479
|
+
return [`transcript:${value("transcript_id")}`];
|
|
480
|
+
case "book":
|
|
481
|
+
case "book_metadata":
|
|
482
|
+
return ["book"];
|
|
483
|
+
case "notebooks":
|
|
484
|
+
case "cells":
|
|
485
|
+
case "edges":
|
|
486
|
+
case "runs":
|
|
487
|
+
case "cell_references":
|
|
488
|
+
case "pinned_search_results":
|
|
489
|
+
return [`notebook:${value("notebook_id")}`];
|
|
490
|
+
default:
|
|
491
|
+
return [
|
|
492
|
+
`${shape.table}:${shape.primaryKey.map((column) => value(column)).join(":")}`,
|
|
493
|
+
];
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
function tableShape(db, table) {
|
|
497
|
+
const info = db
|
|
498
|
+
.prepare(`PRAGMA table_info(${table})`)
|
|
499
|
+
.all();
|
|
500
|
+
return {
|
|
501
|
+
table,
|
|
502
|
+
columns: info.map((column) => column.name),
|
|
503
|
+
primaryKey: info
|
|
504
|
+
.filter((column) => column.pk > 0)
|
|
505
|
+
.sort((left, right) => left.pk - right.pk)
|
|
506
|
+
.map((column) => column.name),
|
|
507
|
+
};
|
|
508
|
+
}
|
|
509
|
+
function rowsByKey(db, shape, ref) {
|
|
510
|
+
const rows = db
|
|
511
|
+
.prepare(`SELECT * FROM dolt_at_${shape.table}(?)`)
|
|
512
|
+
.all(ref);
|
|
513
|
+
return new Map(rows.map((row) => [rowKey(shape, row), row]));
|
|
514
|
+
}
|
|
515
|
+
function rowKey(shape, row) {
|
|
516
|
+
return canonicalJson(shape.primaryKey.map((column) => comparable(row[column])));
|
|
517
|
+
}
|
|
518
|
+
function keyObject(shape, key) {
|
|
519
|
+
const values = JSON.parse(key);
|
|
520
|
+
return Object.fromEntries(shape.primaryKey.map((column, index) => [column, values[index]]));
|
|
521
|
+
}
|
|
522
|
+
function comparable(value) {
|
|
523
|
+
if (value instanceof Uint8Array) {
|
|
524
|
+
return `blob:${Buffer.from(value).toString("hex")}`;
|
|
525
|
+
}
|
|
526
|
+
return value ?? null;
|
|
527
|
+
}
|
|
528
|
+
function rowsEqual(left, right) {
|
|
529
|
+
const keys = new Set([...Object.keys(left), ...Object.keys(right)]);
|
|
530
|
+
for (const key of keys) {
|
|
531
|
+
const a = comparable(left[key]);
|
|
532
|
+
const b = comparable(right[key]);
|
|
533
|
+
if (a !== b)
|
|
534
|
+
return false;
|
|
535
|
+
}
|
|
536
|
+
return true;
|
|
537
|
+
}
|
|
538
|
+
/** Live (non-forgotten) objects present at `theirsRef` but not at `oursRef`. */
|
|
539
|
+
function objectsAddedByFork(db, oursRef, theirsRef) {
|
|
540
|
+
const ours = new Set(db
|
|
541
|
+
.prepare("SELECT object_hash FROM dolt_at_objects(?)")
|
|
542
|
+
.all(oursRef).map((row) => row.object_hash));
|
|
543
|
+
const theirs = db
|
|
544
|
+
.prepare(`SELECT object_hash, size_bytes, forgotten_at
|
|
545
|
+
FROM dolt_at_objects(?) ORDER BY created_at, object_hash`)
|
|
546
|
+
.all(theirsRef);
|
|
547
|
+
return theirs.filter((row) => row.forgotten_at === null && !ours.has(row.object_hash));
|
|
548
|
+
}
|
|
549
|
+
/**
|
|
550
|
+
* Moves the fork's new objects into the upstream object store. Runs after
|
|
551
|
+
* the merge is verified but before the catalog ref is pushed, so the
|
|
552
|
+
* catalog never points at objects upstream cannot serve — the same
|
|
553
|
+
* objects-before-push ordering as engine.storage.backup.
|
|
554
|
+
*/
|
|
555
|
+
async function uploadForkObjects(db, objects, options) {
|
|
556
|
+
if (objects.length === 0)
|
|
557
|
+
return [];
|
|
558
|
+
if (!options.upstreamObjects || !options.forkObjects) {
|
|
559
|
+
throw new EngineFault({
|
|
560
|
+
code: "INVALID_INPUT",
|
|
561
|
+
message: `Fork adds ${objects.length} object(s); upstreamObjects and ` +
|
|
562
|
+
"forkObjects are required to move them before the catalog moves",
|
|
563
|
+
details: { hashes: objects.map((row) => row.object_hash) },
|
|
564
|
+
});
|
|
565
|
+
}
|
|
566
|
+
const prefix = options.objectPrefix;
|
|
567
|
+
const downloadDir = await mkdtemp(path.join(tmpdir(), "videobook-merge-objects-"));
|
|
568
|
+
try {
|
|
569
|
+
const forkStore = new ObjectStore(path.join(downloadDir, "fork"), options.forkObjects, prefix);
|
|
570
|
+
const upstreamStore = new ObjectStore(path.join(downloadDir, "upstream"), options.upstreamObjects, prefix);
|
|
571
|
+
const uploaded = [];
|
|
572
|
+
for (const row of objects) {
|
|
573
|
+
// ensureLocalPath lazily fetches the bytes from the fork's
|
|
574
|
+
// public-read store; publish uploads and verifies the remote copy.
|
|
575
|
+
const localPath = await forkStore.ensureLocalPath(row.object_hash);
|
|
576
|
+
const staged = upstreamStore.pathFor(row.object_hash);
|
|
577
|
+
await mkdir(path.dirname(staged), { recursive: true });
|
|
578
|
+
await copyFile(localPath, staged);
|
|
579
|
+
await upstreamStore.publish(row.object_hash, row.size_bytes);
|
|
580
|
+
uploaded.push(row.object_hash);
|
|
581
|
+
}
|
|
582
|
+
return uploaded;
|
|
583
|
+
}
|
|
584
|
+
finally {
|
|
585
|
+
await rm(downloadDir, { recursive: true, force: true });
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
function findRemote(db, name) {
|
|
589
|
+
const rows = db
|
|
590
|
+
.prepare("SELECT * FROM dolt_remotes()")
|
|
591
|
+
.all();
|
|
592
|
+
const remote = rows.find((row) => row.name === name);
|
|
593
|
+
return remote ? { name: remote.name, url: remote.url } : null;
|
|
594
|
+
}
|
|
595
|
+
function ensureRemote(db, name, url) {
|
|
596
|
+
const existing = findRemote(db, name);
|
|
597
|
+
if (existing) {
|
|
598
|
+
if (existing.url !== url) {
|
|
599
|
+
throw new EngineFault({
|
|
600
|
+
code: "INVALID_INPUT",
|
|
601
|
+
message: `Remote ${name} already points to a different URL`,
|
|
602
|
+
details: { name, existing: existing.url, requested: url },
|
|
603
|
+
});
|
|
604
|
+
}
|
|
605
|
+
return;
|
|
606
|
+
}
|
|
607
|
+
db.prepare("SELECT dolt_remote('add', ?, ?) AS result").get(name, url);
|
|
608
|
+
}
|
|
609
|
+
//# sourceMappingURL=fork.js.map
|
package/dist/fork.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fork.js","sourceRoot":"","sources":["../src/fork.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAOpC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,YAAY,EAAe,MAAM,aAAa,CAAC;AACxD,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAsIxD,MAAM,oBAAoB,GAAG,iCAAiC,CAAC;AAE/D;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAA6B;IAE7B,IACE,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC;QACpC,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS,CAAC,EACnC,CAAC;QACD,MAAM,IAAI,WAAW,CAAC;YACpB,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,wDAAwD;SAClE,CAAC,CAAC;IACL,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IACxD,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACvC,MAAM,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IACrD,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,YAAY,CAAC,CAAC;QAC1C,IAAI,CAAC;YACH,EAAE,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YACtE,sEAAsE;YACtE,8DAA8D;YAC9D,iEAAiE;YACjE,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,EAAE,CAAC;YAChE,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC;gBACH,EAAE,CAAC,KAAK,EAAE,CAAC;YACb,CAAC;YAAC,MAAM,CAAC;gBACP,sDAAsD;YACxD,CAAC;YACD,MAAM,EAAE,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACxC,MAAM,IAAI,WAAW,CAAC;gBACpB,IAAI,EAAE,qBAAqB;gBAC3B,OAAO,EACL,+DAA+D;oBAC/D,8DAA8D;oBAC9D,iEAAiE;oBACjE,4BAA4B;gBAC9B,OAAO,EAAE;oBACP,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAC9D;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,YAAY,CAAC;QAClB,OAAO;QACP,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC;QAChD,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5D,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,OAAyB;IAEzB,MAAM,OAAO,GACX,OAAO,CAAC,OAAO;QACf,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC;IAChE,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACnD,IAAI,OAAO,CAAC,WAAW;YAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;QAClD,OAAO,MAAM,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACzB,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,OAAe,EACf,OAAyB;IAEzB,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,IAAI,MAAM,CAAC;IACzD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,MAAM,CAAC;IAChD,MAAM,SAAS,GAAG,GAAG,cAAc,IAAI,UAAU,EAAE,CAAC;IACpD,MAAM,YAAY,GAAG,cAAc,cAAc,IAAI,UAAU,EAAE,CAAC;IAElE,MAAM,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;IAC3E,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;IAChE,IAAI,CAAC;QACH,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,UAAU,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC1E,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,IAAI,WAAW,CAAC;gBACpB,IAAI,EAAE,eAAe;gBACrB,OAAO,EACL,iEAAiE;oBACjE,qBAAqB;aACxB,CAAC,CAAC;QACL,CAAC;QACD,YAAY,CAAC,EAAE,EAAE,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC;QAC1D,YAAY,CAAC,EAAE,EAAE,cAAc,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACzD,IAAI,CAAC;YACH,EAAE,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,WAAW,CAAC;gBACpB,IAAI,EAAE,SAAS;gBACf,OAAO,EACL,+BAA+B,cAAc,IAAI;oBACjD,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;aAC3D,CAAC,CAAC;QACL,CAAC;QAED,uEAAuE;QACvE,2DAA2D;QAC3D,qEAAqE;QACrE,gEAAgE;QAChE,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,IAAI,EAAE,CAAC;QACpE,IAAI,EAAE,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC,EAAE,CAAC;YACrE,EAAE,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACxE,CAAC;QACD,EAAE,CAAC,UAAU,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QACvC,MAAM,cAAc,GAClB,EAAE,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC,EAAE,IAAI;YACtE,EAAE,CAAC;QACL,IAAI,CAAC,YAAY,IAAI,CAAC,cAAc,EAAE,CAAC;YACrC,MAAM,IAAI,WAAW,CAAC;gBACpB,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,8CAA8C,SAAS,EAAE;aACnE,CAAC,CAAC;QACL,CAAC;QACD,MAAM,OAAO,GAAG,EAAE;aACf,OAAO,CAAC,sCAAsC,CAAC;aAC/C,GAAG,CAAC,MAAM,EAAE,YAAY,CACU,CAAC;QACtC,MAAM,YAAY,GAAG,OAAO,EAAE,IAAI,IAAI,IAAI,CAAC;QAC3C,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,WAAW,CAAC;gBACpB,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EACL,iBAAiB,SAAS,oCAAoC;oBAC9D,6CAA6C;gBAC/C,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE;aAC/B,CAAC,CAAC;QACL,CAAC;QAED,sEAAsE;QACtE,4DAA4D;QAC5D,MAAM,UAAU,GAAG,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;QAEhE,IAAI,iBAAiB,GAAG,YAAY,CAAC;QACrC,IAAI,UAAU,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;QAClD,IAAI,iBAAiB,GACnB,YAAY,KAAK,cAAc,IAAI,YAAY,KAAK,cAAc,CAAC;QACrE,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,SAAS,CAAC,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE;gBACzD,YAAY;gBACZ,YAAY;gBACZ,cAAc;gBACd,UAAU,EAAE,GAAG,cAAc,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE;gBACzD,UAAU;gBACV,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,oBAAoB;aAC/C,CAAC,CAAC;YACH,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;gBACzB,iBAAiB,GAAG,IAAI,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,iBAAiB,GAAG,WAAW,CAAC,MAAM,CAAC;gBACvC,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC;YACtC,CAAC;QACH,CAAC;QAED,MAAM,eAAe,GAAG,MAAM,iBAAiB,CAAC,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QAEzE,IAAI,CAAC;YACH,EAAE,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC,GAAG,CACrD,cAAc,CAAC,IAAI,CACpB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,IAAI,kCAAkC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBACrD,MAAM,IAAI,WAAW,CAAC;oBACpB,IAAI,EAAE,UAAU;oBAChB,OAAO,EACL,4DAA4D;wBAC5D,0CAA0C,OAAO,GAAG;iBACvD,CAAC,CAAC;YACL,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,OAAO;YACL,iBAAiB;YACjB,YAAY;YACZ,YAAY;YACZ,cAAc;YACd,iBAAiB;YACjB,eAAe;YACf,qBAAqB,EAAE,UAAU,CAAC,WAAW;YAC7C,mBAAmB,EAAE,UAAU,CAAC,SAAS;SAC1C,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,SAAS,CAChB,EAAgB,EAChB,OAAe,EACf,UAAkB,EAClB,OAOC;IAKD,uBAAuB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,aAAa,GAAG,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7D,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,WAAW,CAAC;YACpB,IAAI,EAAE,gBAAgB;YACtB,OAAO,EACL,iBAAiB,UAAU,kCAAkC;gBAC7D,aAAa,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAC3D,OAAO,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE;SAC/C,CAAC,CAAC;IACL,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IACnE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,oEAAoE;QACpE,kEAAkE;QAClE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,UAAU,GAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;IAC/C,sBAAsB,CAAC,EAAE,CAAC,CAAC;IAE3B,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;QACpC,EAAE,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC;IAC7B,yEAAyE;IACzE,mEAAmE;IACnE,yEAAyE;IACzE,6DAA6D;IAC7D,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/D,MAAM,eAAe,GACnB,MAAM,CAAC,UAAU,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,MAAM;QAC/C,CAAC,CAAC,cAAc,YAAY,EAAE;QAC9B,CAAC,CAAC,sBAAsB,MAAM,CAAC,UAAU,CAAC,YAAY,EAAE,MAAM,CAAC,EAAE,CAAC;IACtE,MAAM,OAAO,GAAG;QACd,YAAY;QACZ,EAAE;QACF,UAAU,WAAW,EAAE;QACvB,kBAAkB,OAAO,CAAC,YAAY,EAAE;QACxC,oBAAoB,OAAO,CAAC,cAAc,EAAE;QAC5C,eAAe;QACf,YAAY,aAAa,CAAC;YACxB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,YAAY,EAAE,OAAO,CAAC,YAAY;SACnC,CAAC,EAAE;KACL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,MAAM,GAAG,GAAG,EAAE;SACX,OAAO,CAAC,oDAAoD,CAAC;SAC7D,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAA4C,CAAC;IAC3E,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,WAAW,CAAC;YACpB,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,4CAA4C;SACtD,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC;AAC1C,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAS,SAAS,CAChB,EAAgB,EAChB,OAAe,EACf,SAAiB,EACjB,OAAe;IAEf,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IACrE,MAAM,MAAM,GAGP,EAAE,CAAC;IACR,MAAM,SAAS,GAAkB,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAkC,IAAI,CAAC,CAAC;QAC9D,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,GAA4B,EAAQ,EAAE;YACnE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACrB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QACzE,CAAC,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACxB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACxB,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;gBACvC,mBAAmB;gBACnB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;oBACxC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;oBAChD,IAAI,QAAQ,EAAE,CAAC;wBACb,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;4BAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;oBACvD,CAAC;yBAAM,CAAC;wBACN,SAAS,CAAC,IAAI,CAAC;4BACb,KAAK,EAAE,KAAK,CAAC,KAAK;4BAClB,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC;4BAC1B,MAAM,EAAE,gDAAgD;yBACzD,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;qBAAM,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;oBAC3B,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;iBAAM,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC9C,qBAAqB;gBACrB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;oBACxC,SAAS,CAAC,IAAI,CAAC;wBACb,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC;wBAC1B,MAAM,EAAE,4CAA4C;qBACrD,CAAC,CAAC;gBACL,CAAC;qBAAM,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;oBAC3B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBACnB,OAAO,GAAG,IAAI,CAAC;oBACf,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACvE,CAAC;YACH,CAAC;iBAAM,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBAClE,qBAAqB;gBACrB,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;oBACpB,SAAS,CAAC,IAAI,CAAC;wBACb,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC;wBAC1B,MAAM,EAAE,4CAA4C;qBACrD,CAAC,CAAC;gBACL,CAAC;qBAAM,IAAI,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;oBAC9C,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;wBAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBACzC,CAAC;qBAAM,CAAC;oBACN,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;oBAChD,IAAI,QAAQ,EAAE,CAAC;wBACb,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;4BAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;oBACvD,CAAC;yBAAM,CAAC;wBACN,SAAS,CAAC,IAAI,CAAC;4BACb,KAAK,EAAE,KAAK,CAAC,KAAK;4BAClB,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC;4BAC1B,MAAM,EAAE,wCAAwC;yBACjD,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,WAAW,CAAC;YACpB,IAAI,EAAE,gBAAgB;YACtB,OAAO,EACL,yCAAyC,SAAS,CAAC,MAAM,UAAU;gBACnE,UAAU,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,aAAa;gBAClE,SAAS;qBACN,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;qBACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;qBAClD,IAAI,CAAC,IAAI,CAAC;gBACb,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACrC,OAAO,EAAE,EAAE,SAAS,EAAE;SACvB,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,EAAE,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACrC,IAAI,CAAC;QACH,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9C,EAAE,CAAC,OAAO,CAAC,eAAe,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;QACjD,CAAC;QACD,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAChC,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB,eAAe,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;mBAC3C,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACtD,CAAC;YACF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,CAAC;AACtB,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,iBAAiB,CACxB,KAAiB,EACjB,IAA6B,EAC7B,MAA+B;IAE/B,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACrE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,KAAK,cAAc;YAAE,SAAS;QACrC,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;IACrE,CAAC;IACD,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAA8B,CAAC;IACxE,MAAM,eAAe,GAAG,MAAM,CAAC,cAAc,CAA8B,CAAC;IAC5E,MAAM,SAAS,GACb,aAAa,IAAI,IAAI,IAAI,eAAe,IAAI,IAAI;QAC9C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,eAAe,CAAC;QAC1C,CAAC,CAAC,CAAC,aAAa,IAAI,eAAe,IAAI,IAAI,CAAC,CAAC;IACjD,OAAO,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;AAC9C,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CACnB,KAAiB,EACjB,GAA4B;IAE5B,MAAM,KAAK,GAAG,CAAC,MAAc,EAAU,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACpE,QAAQ,KAAK,CAAC,KAAK,EAAE,CAAC;QACpB,KAAK,WAAW;YACd,OAAO,CAAC,YAAY,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,KAAK,iBAAiB;YACpB,OAAO,CAAC,YAAY,KAAK,CAAC,aAAa,CAAC,EAAE,EAAE,SAAS,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC5E,KAAK,gBAAgB;YACnB,OAAO,CAAC,QAAQ,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACpE,KAAK,YAAY,CAAC;QAClB,KAAK,iBAAiB;YACpB,OAAO,CAAC,QAAQ,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACtC,KAAK,aAAa;YAChB,OAAO,CAAC,cAAc,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QAClD,KAAK,cAAc;YACjB,OAAO,CAAC,SAAS,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACxC,KAAK,WAAW;YACd,OAAO,CAAC,YAAY,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,KAAK,gBAAgB,CAAC;QACtB,KAAK,kBAAkB,CAAC;QACxB,KAAK,mBAAmB,CAAC;QACzB,KAAK,iBAAiB;YACpB,OAAO,CAAC,YAAY,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,KAAK,SAAS;YACZ,OAAO,CAAC,UAAU,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC5C,KAAK,aAAa;YAChB,OAAO,CAAC,cAAc,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QAClD,KAAK,qBAAqB;YACxB,OAAO,CAAC,cAAc,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QAClD,KAAK,MAAM,CAAC;QACZ,KAAK,eAAe;YAClB,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,KAAK,WAAW,CAAC;QACjB,KAAK,OAAO,CAAC;QACb,KAAK,OAAO,CAAC;QACb,KAAK,MAAM,CAAC;QACZ,KAAK,iBAAiB,CAAC;QACvB,KAAK,uBAAuB;YAC1B,OAAO,CAAC,YAAY,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C;YACE,OAAO;gBACL,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;aAC9E,CAAC;IACN,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,EAAgB,EAAE,KAAa;IACjD,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CAAC,qBAAqB,KAAK,GAAG,CAAC;SACtC,GAAG,EAGJ,CAAC;IACH,OAAO;QACL,KAAK;QACL,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;QAC1C,UAAU,EAAE,IAAI;aACb,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;aACjC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;aACzC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;KAChC,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAChB,EAAgB,EAChB,KAAiB,EACjB,GAAW;IAEX,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CAAC,yBAAyB,KAAK,CAAC,KAAK,KAAK,CAAC;SAClD,GAAG,CAAC,GAAG,CAA8C,CAAC;IACzD,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,MAAM,CAAC,KAAiB,EAAE,GAA4B;IAC7D,OAAO,aAAa,CAClB,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAC1D,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAAiB,EAAE,GAAW;IAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC;IAC5C,OAAO,MAAM,CAAC,WAAW,CACvB,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CACjE,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAChC,OAAO,QAAQ,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;IACtD,CAAC;IACD,OAAO,KAAK,IAAI,IAAI,CAAC;AACvB,CAAC;AAED,SAAS,SAAS,CAChB,IAA6B,EAC7B,KAA8B;IAE9B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACpE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;IAC5B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAQD,gFAAgF;AAChF,SAAS,kBAAkB,CACzB,EAAgB,EAChB,OAAe,EACf,SAAiB;IAEjB,MAAM,IAAI,GAAG,IAAI,GAAG,CAEhB,EAAE;SACC,OAAO,CAAC,4CAA4C,CAAC;SACrD,GAAG,CAAC,OAAO,CACf,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAChC,CAAC;IACF,MAAM,MAAM,GAAG,EAAE;SACd,OAAO,CACN;gEAC0D,CAC3D;SACA,GAAG,CAAC,SAAS,CAA2B,CAAC;IAC5C,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,YAAY,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CACjE,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,iBAAiB,CAC9B,EAAgB,EAChB,OAAoB,EACpB,OAAyB;IAEzB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACrD,MAAM,IAAI,WAAW,CAAC;YACpB,IAAI,EAAE,eAAe;YACrB,OAAO,EACL,aAAa,OAAO,CAAC,MAAM,kCAAkC;gBAC7D,gEAAgE;YAClE,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;SAC3D,CAAC,CAAC;IACL,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IACpC,MAAM,WAAW,GAAG,MAAM,OAAO,CAC/B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,0BAA0B,CAAC,CAChD,CAAC;IACF,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,WAAW,CAC/B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,EAC9B,OAAO,CAAC,WAAW,EACnB,MAAM,CACP,CAAC;QACF,MAAM,aAAa,GAAG,IAAI,WAAW,CACnC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,EAClC,OAAO,CAAC,eAAe,EACvB,MAAM,CACP,CAAC;QACF,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,2DAA2D;YAC3D,mEAAmE;YACnE,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACnE,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACtD,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACvD,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAClC,MAAM,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;YAC7D,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CACjB,EAAgB,EAChB,IAAY;IAEZ,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CAAC,8BAA8B,CAAC;SACvC,GAAG,EAA4B,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACrD,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAChE,CAAC;AAED,SAAS,YAAY,CAAC,EAAgB,EAAE,IAAY,EAAE,GAAW;IAC/D,MAAM,QAAQ,GAAG,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACtC,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,QAAQ,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;YACzB,MAAM,IAAI,WAAW,CAAC;gBACpB,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,UAAU,IAAI,oCAAoC;gBAC3D,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE;aAC1D,CAAC,CAAC;QACL,CAAC;QACD,OAAO;IACT,CAAC;IACD,EAAE,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACzE,CAAC"}
|
package/dist/history.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { GetHistoryActionsOptions, HistoryAction, HistoryActionPage, HistoryActionRevision, RecordActionInput } from "./history-types.js";
|
|
2
1
|
import type { ActionLogEntry, EngineError, Result, Revision } from "./engine-types.js";
|
|
3
2
|
import { EngineContext } from "./context.js";
|
|
4
3
|
export declare function createHistoryApi(context: EngineContext): {
|
|
@@ -13,8 +12,5 @@ export declare function createHistoryApi(context: EngineContext): {
|
|
|
13
12
|
limit?: number;
|
|
14
13
|
action?: string;
|
|
15
14
|
}) => ActionLogEntry[];
|
|
16
|
-
actions: (options?: GetHistoryActionsOptions) => Result<HistoryActionPage, EngineError>;
|
|
17
|
-
action: (actionId: string) => Result<HistoryAction, EngineError>;
|
|
18
|
-
recordAction: (input: RecordActionInput) => Promise<Result<HistoryActionRevision, EngineError>>;
|
|
19
15
|
};
|
|
20
16
|
//# sourceMappingURL=history.d.ts.map
|
package/dist/history.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,MAAM,EACN,QAAQ,EACT,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,aAAa,EAA8B,MAAM,cAAc,CAAC;AAyCzE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa;mCAE1B,QAAQ,EAAE;yBACd,MAAM,qBAAe,QAAQ,EAAE;gCAExB,MAAM,KAAG,QAAQ,GAAG,IAAI;iCAGvC,MAAM,aACN,MAAM,YACP,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAChC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;kCAG3B,MAAM,YACR,MAAM,SACT,MAAM,KACZ,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;wBAErB,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;wBAGzD,MAAM,WACL,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KACxC,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;0BAEzB;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,KAAG,cAAc,EAAE;EAEvB"}
|