videobook-engine 4.2.0 → 5.3.2
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 +84 -39
- package/dist/artifacts.d.ts +5 -10
- package/dist/artifacts.d.ts.map +1 -1
- package/dist/artifacts.js +79 -142
- package/dist/artifacts.js.map +1 -1
- package/dist/books.d.ts +1 -1
- package/dist/books.d.ts.map +1 -1
- package/dist/books.js +16 -9
- package/dist/books.js.map +1 -1
- package/dist/cas.d.ts +2 -1
- package/dist/cas.d.ts.map +1 -1
- package/dist/cas.js +33 -4
- package/dist/cas.js.map +1 -1
- package/dist/catalog-gc-state.d.ts +4 -0
- package/dist/catalog-gc-state.d.ts.map +1 -0
- package/dist/catalog-gc-state.js +49 -0
- package/dist/catalog-gc-state.js.map +1 -0
- package/dist/catalog-metadata.d.ts +2 -2
- package/dist/catalog-metadata.js +3 -3
- package/dist/catalog-metadata.js.map +1 -1
- package/dist/context.d.ts +5 -5
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +17 -49
- package/dist/context.js.map +1 -1
- package/dist/domain.d.ts +35 -2
- package/dist/domain.d.ts.map +1 -1
- package/dist/domain.js +131 -161
- package/dist/domain.js.map +1 -1
- package/dist/edits.js +2 -2
- package/dist/edits.js.map +1 -1
- package/dist/engine-types.d.ts +159 -39
- package/dist/engine-types.d.ts.map +1 -1
- package/dist/engine-types.js +2 -1
- package/dist/engine-types.js.map +1 -1
- package/dist/engine.d.ts +30 -20
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +46 -4
- package/dist/engine.js.map +1 -1
- package/dist/files.d.ts +10 -0
- package/dist/files.d.ts.map +1 -1
- package/dist/files.js +49 -2
- package/dist/files.js.map +1 -1
- package/dist/fork.d.ts +14 -30
- package/dist/fork.d.ts.map +1 -1
- package/dist/fork.js +18 -27
- package/dist/fork.js.map +1 -1
- package/dist/generations.d.ts +9 -0
- package/dist/generations.d.ts.map +1 -0
- package/dist/generations.js +175 -0
- package/dist/generations.js.map +1 -0
- package/dist/history.d.ts +2 -1
- package/dist/history.d.ts.map +1 -1
- package/dist/history.js +30 -57
- package/dist/history.js.map +1 -1
- package/dist/index.d.ts +8 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/inline-temporal-models.d.ts +43 -0
- package/dist/inline-temporal-models.d.ts.map +1 -0
- package/dist/inline-temporal-models.js +236 -0
- package/dist/inline-temporal-models.js.map +1 -0
- package/dist/isolated-models.d.ts +8 -0
- package/dist/isolated-models.d.ts.map +1 -0
- package/dist/isolated-models.js +25 -0
- package/dist/isolated-models.js.map +1 -0
- package/dist/job-queue.d.ts +1 -1
- package/dist/job-queue.d.ts.map +1 -1
- package/dist/job-queue.js +20 -6
- package/dist/job-queue.js.map +1 -1
- package/dist/media-image.d.ts +8 -0
- package/dist/media-image.d.ts.map +1 -0
- package/dist/media-image.js +41 -0
- package/dist/media-image.js.map +1 -0
- package/dist/media-process.d.ts +13 -0
- package/dist/media-process.d.ts.map +1 -0
- package/dist/media-process.js +89 -0
- package/dist/media-process.js.map +1 -0
- package/dist/media.d.ts +3 -3
- package/dist/media.d.ts.map +1 -1
- package/dist/media.js +5 -5
- package/dist/media.js.map +1 -1
- package/dist/merge-policy.d.ts +16 -36
- package/dist/merge-policy.d.ts.map +1 -1
- package/dist/merge-policy.js +13 -125
- package/dist/merge-policy.js.map +1 -1
- package/dist/metadata.d.ts +1 -0
- package/dist/metadata.d.ts.map +1 -1
- package/dist/metadata.js +13 -3
- package/dist/metadata.js.map +1 -1
- package/dist/migrate-grid-text.d.ts +17 -0
- package/dist/migrate-grid-text.d.ts.map +1 -0
- package/dist/migrate-grid-text.js +117 -0
- package/dist/migrate-grid-text.js.map +1 -0
- package/dist/migrate-grid-v22.d.ts +12 -0
- package/dist/migrate-grid-v22.d.ts.map +1 -0
- package/dist/migrate-grid-v22.js +166 -0
- package/dist/migrate-grid-v22.js.map +1 -0
- package/dist/migrate-grid-v23.d.ts +10 -0
- package/dist/migrate-grid-v23.d.ts.map +1 -0
- package/dist/migrate-grid-v23.js +31 -0
- package/dist/migrate-grid-v23.js.map +1 -0
- package/dist/migration-notebooks.d.ts +25 -0
- package/dist/migration-notebooks.d.ts.map +1 -0
- package/dist/migration-notebooks.js +131 -0
- package/dist/migration-notebooks.js.map +1 -0
- package/dist/migration-source.d.ts +6 -0
- package/dist/migration-source.d.ts.map +1 -0
- package/dist/migration-source.js +37 -0
- package/dist/migration-source.js.map +1 -0
- package/dist/migration-timeline.d.ts +36 -0
- package/dist/migration-timeline.d.ts.map +1 -0
- package/dist/migration-timeline.js +187 -0
- package/dist/migration-timeline.js.map +1 -0
- package/dist/migration-validation.d.ts +12 -0
- package/dist/migration-validation.d.ts.map +1 -0
- package/dist/migration-validation.js +68 -0
- package/dist/migration-validation.js.map +1 -0
- package/dist/migration.d.ts.map +1 -1
- package/dist/migration.js +220 -119
- package/dist/migration.js.map +1 -1
- package/dist/model-cache-paths.d.ts +2 -0
- package/dist/model-cache-paths.d.ts.map +1 -0
- package/dist/model-cache-paths.js +5 -0
- package/dist/model-cache-paths.js.map +1 -0
- package/dist/model-checksums.json +338 -0
- package/dist/model-file-resolver.d.ts +30 -0
- package/dist/model-file-resolver.d.ts.map +1 -0
- package/dist/model-file-resolver.js +304 -0
- package/dist/model-file-resolver.js.map +1 -0
- package/dist/model-identity.d.ts +13 -0
- package/dist/model-identity.d.ts.map +1 -0
- package/dist/model-identity.js +44 -0
- package/dist/model-identity.js.map +1 -0
- package/dist/model-worker-errors.d.ts +3 -0
- package/dist/model-worker-errors.d.ts.map +1 -0
- package/dist/model-worker-errors.js +12 -0
- package/dist/model-worker-errors.js.map +1 -0
- package/dist/model-worker-pool.d.ts +32 -0
- package/dist/model-worker-pool.d.ts.map +1 -0
- package/dist/model-worker-pool.js +269 -0
- package/dist/model-worker-pool.js.map +1 -0
- package/dist/model-worker-protocol.d.ts +42 -0
- package/dist/model-worker-protocol.d.ts.map +1 -0
- package/dist/model-worker-protocol.js +2 -0
- package/dist/model-worker-protocol.js.map +1 -0
- package/dist/model-worker.d.ts +2 -0
- package/dist/model-worker.d.ts.map +1 -0
- package/dist/model-worker.js +91 -0
- package/dist/model-worker.js.map +1 -0
- package/dist/mvp-contract-fixtures.js +1 -1
- package/dist/mvp-contract-fixtures.js.map +1 -1
- package/dist/mvp-contracts.d.ts +32 -8
- package/dist/mvp-contracts.d.ts.map +1 -1
- package/dist/mvp-contracts.js +1 -1
- package/dist/mvp-contracts.js.map +1 -1
- package/dist/notebook/types.d.ts +1 -29
- package/dist/notebook/types.d.ts.map +1 -1
- package/dist/notebook-grid.d.ts +46 -0
- package/dist/notebook-grid.d.ts.map +1 -0
- package/dist/notebook-grid.js +187 -0
- package/dist/notebook-grid.js.map +1 -0
- package/dist/notebook-media-artifact.d.ts +23 -0
- package/dist/notebook-media-artifact.d.ts.map +1 -0
- package/dist/notebook-media-artifact.js +67 -0
- package/dist/notebook-media-artifact.js.map +1 -0
- package/dist/notebook-mentions.d.ts +20 -0
- package/dist/notebook-mentions.d.ts.map +1 -0
- package/dist/notebook-mentions.js +54 -0
- package/dist/notebook-mentions.js.map +1 -0
- package/dist/runtime-services.js +4 -9
- package/dist/runtime-services.js.map +1 -1
- package/dist/schema.d.ts +4 -19
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +66 -92
- package/dist/schema.js.map +1 -1
- package/dist/search-provider-access.d.ts +11 -0
- package/dist/search-provider-access.d.ts.map +1 -0
- package/dist/search-provider-access.js +42 -0
- package/dist/search-provider-access.js.map +1 -0
- package/dist/similarity.d.ts +60 -1
- package/dist/similarity.d.ts.map +1 -1
- package/dist/similarity.js +174 -154
- package/dist/similarity.js.map +1 -1
- package/dist/status.js +8 -10
- package/dist/status.js.map +1 -1
- package/dist/store.d.ts +16 -2
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +171 -17
- package/dist/store.js.map +1 -1
- package/dist/temporal-index-cache.d.ts +13 -0
- package/dist/temporal-index-cache.d.ts.map +1 -0
- package/dist/temporal-index-cache.js +59 -0
- package/dist/temporal-index-cache.js.map +1 -0
- package/dist/temporal-model-manifests.d.ts +17 -0
- package/dist/temporal-model-manifests.d.ts.map +1 -0
- package/dist/temporal-model-manifests.js +33 -0
- package/dist/temporal-model-manifests.js.map +1 -0
- package/dist/temporal-models.d.ts +20 -35
- package/dist/temporal-models.d.ts.map +1 -1
- package/dist/temporal-models.js +23 -257
- package/dist/temporal-models.js.map +1 -1
- package/dist/temporal-search.d.ts +6 -3
- package/dist/temporal-search.d.ts.map +1 -1
- package/dist/temporal-search.js +438 -122
- package/dist/temporal-search.js.map +1 -1
- package/dist/temporal-vector-index.d.ts +46 -0
- package/dist/temporal-vector-index.d.ts.map +1 -0
- package/dist/temporal-vector-index.js +220 -0
- package/dist/temporal-vector-index.js.map +1 -0
- package/dist/third-party/@huggingface-jinja.LICENSE +21 -0
- package/dist/third-party/@huggingface-tokenizers.LICENSE +201 -0
- package/dist/third-party/@huggingface-transformers.LICENSE +202 -0
- package/dist/third-party/onnxruntime-common.LICENSE +21 -0
- package/dist/third-party/versions.json +23 -0
- package/dist/transformers-runtime.d.ts +2 -0
- package/dist/transformers-runtime.d.ts.map +1 -0
- package/dist/transformers-runtime.js +33014 -0
- package/dist/transformers-runtime.js.LEGAL.txt +12 -0
- package/dist/transformers-runtime.js.map +7 -0
- package/docs/doltlite-staging.md +69 -0
- package/docs/edit-performance.md +83 -0
- package/docs/engine-layout.md +56 -50
- package/docs/media-limits.md +57 -0
- package/docs/model-download-policy.md +15 -0
- package/docs/model-integrity.md +72 -0
- package/docs/model-isolation.md +72 -0
- package/docs/model-revisions.md +54 -0
- package/docs/mvp-prd.md +2 -2
- package/docs/release-evidence.md +300 -0
- package/docs/search-provider-consent.md +67 -0
- package/docs/semantic-durability.md +55 -0
- package/docs/temporal-search-performance.md +260 -0
- package/docs/v4-migration.md +83 -0
- package/fixtures/v5/contract-fixtures.json +4 -4
- package/package.json +31 -13
- package/dist/artifact-names.d.ts +0 -6
- package/dist/artifact-names.d.ts.map +0 -1
- package/dist/artifact-names.js +0 -56
- package/dist/artifact-names.js.map +0 -1
- package/dist/resolver.d.ts +0 -15
- package/dist/resolver.d.ts.map +0 -1
- package/dist/resolver.js +0 -81
- package/dist/resolver.js.map +0 -1
package/dist/books.js
CHANGED
|
@@ -1,26 +1,33 @@
|
|
|
1
1
|
import { ok } from "./engine-types.js";
|
|
2
|
-
import {
|
|
2
|
+
import { resultOf } from "./context.js";
|
|
3
|
+
import { EngineFault } from "./store.js";
|
|
3
4
|
export function createBookApi(context) {
|
|
4
5
|
return {
|
|
5
6
|
get: () => context.book(),
|
|
6
|
-
rename: (
|
|
7
|
+
rename: (name) => renameBook(context, name),
|
|
7
8
|
};
|
|
8
9
|
}
|
|
9
|
-
async function renameBook(context,
|
|
10
|
+
async function renameBook(context, requestedName) {
|
|
10
11
|
return resultOf(async () => {
|
|
11
12
|
const current = context.bookRow();
|
|
12
|
-
const
|
|
13
|
-
if (
|
|
13
|
+
const name = requestedName.trim();
|
|
14
|
+
if (!name) {
|
|
15
|
+
throw new EngineFault({
|
|
16
|
+
code: "INVALID_INPUT",
|
|
17
|
+
message: "Book name must be non-empty",
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
if (current.name === name)
|
|
14
21
|
return context.book(current);
|
|
15
22
|
const mutation = await context.store.semantic({
|
|
16
23
|
operation: "rename_book",
|
|
17
24
|
tables: ["book"],
|
|
18
|
-
details: {
|
|
19
|
-
writeSet: ["book"
|
|
25
|
+
details: { oldName: current.name, newName: name },
|
|
26
|
+
writeSet: ["book"],
|
|
20
27
|
}, () => {
|
|
21
28
|
context.store.db
|
|
22
|
-
.prepare("UPDATE book SET
|
|
23
|
-
.run(
|
|
29
|
+
.prepare("UPDATE book SET name=? WHERE book_id=?")
|
|
30
|
+
.run(name, current.book_id);
|
|
24
31
|
});
|
|
25
32
|
return ok(context.book(), mutation.revision);
|
|
26
33
|
});
|
package/dist/books.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"books.js","sourceRoot":"","sources":["../src/books.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AACvC,OAAO,
|
|
1
|
+
{"version":3,"file":"books.js","sourceRoot":"","sources":["../src/books.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AACvC,OAAO,EAAiB,QAAQ,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,UAAU,aAAa,CAAC,OAAsB;IAClD,OAAO;QACL,GAAG,EAAE,GAAS,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE;QAC/B,MAAM,EAAE,CAAC,IAAY,EAAsC,EAAE,CAC3D,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC;KAC5B,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,OAAsB,EACtB,aAAqB;IAErB,OAAO,QAAQ,CAAC,KAAK,IAAI,EAAE;QACzB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,WAAW,CAAC;gBACpB,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,6BAA6B;aACvC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,QAAQ,CAC3C;YACE,SAAS,EAAE,aAAa;YACxB,MAAM,EAAE,CAAC,MAAM,CAAC;YAChB,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;YACjD,QAAQ,EAAE,CAAC,MAAM,CAAC;SACnB,EACD,GAAG,EAAE;YACH,OAAO,CAAC,KAAK,CAAC,EAAE;iBACb,OAAO,CAAC,wCAAwC,CAAC;iBACjD,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC,CACF,CAAC;QACF,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/cas.d.ts
CHANGED
|
@@ -16,9 +16,10 @@ export interface StoredObject {
|
|
|
16
16
|
export declare class ObjectStore {
|
|
17
17
|
private readonly remote?;
|
|
18
18
|
private readonly isForgotten?;
|
|
19
|
+
private readonly allowDownload;
|
|
19
20
|
readonly root: string;
|
|
20
21
|
readonly prefix: string;
|
|
21
|
-
constructor(root: string, remote?: ContentStore | undefined, prefix?: string, isForgotten?: ((hash: string) => boolean) | undefined);
|
|
22
|
+
constructor(root: string, remote?: ContentStore | undefined, prefix?: string, isForgotten?: ((hash: string) => boolean) | undefined, allowDownload?: () => boolean);
|
|
22
23
|
put(data: Buffer | string): Promise<StoredObject>;
|
|
23
24
|
import(sourcePath: string): Promise<StoredObject>;
|
|
24
25
|
read(hash: string): Promise<Buffer>;
|
package/dist/cas.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cas.d.ts","sourceRoot":"","sources":["../src/cas.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"cas.d.ts","sourceRoot":"","sources":["../src/cas.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGtD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;GAQG;AACH,qBAAa,WAAW;IAMpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IAExB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAC7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IARhC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAGtB,IAAI,EAAE,MAAM,EACK,MAAM,CAAC,EAAE,YAAY,YAAA,EACtC,MAAM,SAAoC,EACzB,WAAW,CAAC,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,aAAA,EACvC,aAAa,GAAE,MAAM,OAAoB;IAMtD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAmBjD,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAgBjD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKzC;;;OAGG;IACG,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK9C,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBjE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBhE,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAK7B;;;;OAIG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWjD;;;OAGG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS/C;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAmBpC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;YAKd,WAAW;CA0C1B"}
|
package/dist/cas.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
import { createReadStream } from "node:fs";
|
|
2
|
+
import { createReadStream, renameSync } from "node:fs";
|
|
3
3
|
import { constants, copyFile, mkdir, readdir, readFile, rename, rm, stat, writeFile, } from "node:fs/promises";
|
|
4
4
|
import * as path from "node:path";
|
|
5
5
|
import { v7 as uuidv7 } from "uuid";
|
|
6
|
+
import { EngineFault } from "./store.js";
|
|
6
7
|
/**
|
|
7
8
|
* Local content-addressed store with an optional remote ContentStore.
|
|
8
9
|
*
|
|
@@ -15,11 +16,13 @@ import { v7 as uuidv7 } from "uuid";
|
|
|
15
16
|
export class ObjectStore {
|
|
16
17
|
remote;
|
|
17
18
|
isForgotten;
|
|
19
|
+
allowDownload;
|
|
18
20
|
root;
|
|
19
21
|
prefix;
|
|
20
|
-
constructor(root, remote, prefix = "superlzy-media/videobook/sha256", isForgotten) {
|
|
22
|
+
constructor(root, remote, prefix = "superlzy-media/videobook/sha256", isForgotten, allowDownload = () => true) {
|
|
21
23
|
this.remote = remote;
|
|
22
24
|
this.isForgotten = isForgotten;
|
|
25
|
+
this.allowDownload = allowDownload;
|
|
23
26
|
this.root = root;
|
|
24
27
|
this.prefix = prefix.replace(/^\/+|\/+$/g, "");
|
|
25
28
|
}
|
|
@@ -76,7 +79,14 @@ export class ObjectStore {
|
|
|
76
79
|
async materialize(hash, destinationPath) {
|
|
77
80
|
await this.ensureLocal(hash);
|
|
78
81
|
await mkdir(path.dirname(destinationPath), { recursive: true });
|
|
79
|
-
|
|
82
|
+
const temporary = `${destinationPath}.${uuidv7()}.materialize`;
|
|
83
|
+
try {
|
|
84
|
+
await copyFile(this.pathFor(hash), temporary, constants.COPYFILE_EXCL);
|
|
85
|
+
await rename(temporary, destinationPath);
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
await rm(temporary, { force: true }).catch(() => undefined);
|
|
89
|
+
}
|
|
80
90
|
}
|
|
81
91
|
async publish(hash, expectedSize) {
|
|
82
92
|
if (!this.remote)
|
|
@@ -178,13 +188,32 @@ export class ObjectStore {
|
|
|
178
188
|
if (error.code !== "ENOENT")
|
|
179
189
|
throw error;
|
|
180
190
|
}
|
|
191
|
+
if (!this.allowDownload()) {
|
|
192
|
+
throw new EngineFault({
|
|
193
|
+
code: "MEDIA_MISSING",
|
|
194
|
+
message: `Media is not available locally: ${hash}. Retrieve it explicitly before retrying.`,
|
|
195
|
+
details: { objectHash: hash, reason: "local_media_missing" },
|
|
196
|
+
});
|
|
197
|
+
}
|
|
181
198
|
if (!this.remote)
|
|
182
199
|
throw new Error(`Object unavailable: ${hash}`);
|
|
183
200
|
await mkdir(path.dirname(destination), { recursive: true });
|
|
184
201
|
const temporary = `${destination}.${uuidv7()}.download`;
|
|
185
202
|
try {
|
|
186
203
|
await this.remote.downloadFile(this.keyFor(hash), temporary);
|
|
187
|
-
await
|
|
204
|
+
const actualHash = await hashFile(temporary);
|
|
205
|
+
if (actualHash !== hash) {
|
|
206
|
+
throw new EngineFault({
|
|
207
|
+
code: "OBJECT_UNAVAILABLE",
|
|
208
|
+
message: `Downloaded object checksum mismatch: ${hash}`,
|
|
209
|
+
details: { objectHash: hash, actualHash, reason: "checksum_mismatch" },
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
// Keep the final tombstone check and publication in one synchronous
|
|
213
|
+
// section: a forget during download/verification must not resurrect bytes.
|
|
214
|
+
if (this.isForgotten?.(hash))
|
|
215
|
+
throw new Error(`Object unavailable: ${hash}`);
|
|
216
|
+
renameSync(temporary, destination);
|
|
188
217
|
}
|
|
189
218
|
finally {
|
|
190
219
|
await rm(temporary, { force: true }).catch(() => undefined);
|
package/dist/cas.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cas.js","sourceRoot":"","sources":["../src/cas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"cas.js","sourceRoot":"","sources":["../src/cas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function isCatalogCompacted(databasePath: string): boolean;
|
|
2
|
+
export declare function forgetCatalogCompaction(databasePath: string): void;
|
|
3
|
+
export declare function rememberCatalogCompaction(databasePath: string): void;
|
|
4
|
+
//# sourceMappingURL=catalog-gc-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-gc-state.d.ts","sourceRoot":"","sources":["../src/catalog-gc-state.ts"],"names":[],"mappings":"AAUA,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAUhE;AAED,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAGlE;AAED,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CASpE"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { readFileSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
3
|
+
function fingerprint(databasePath) {
|
|
4
|
+
const stat = statSync(databasePath, { bigint: true });
|
|
5
|
+
return [stat.dev, stat.ino, stat.size, stat.mtimeNs, stat.ctimeNs].join(":");
|
|
6
|
+
}
|
|
7
|
+
function markerPath(databasePath) { return `${databasePath}.gc.json`; }
|
|
8
|
+
export function isCatalogCompacted(databasePath) {
|
|
9
|
+
try {
|
|
10
|
+
const marker = JSON.parse(readFileSync(markerPath(databasePath), "utf8"));
|
|
11
|
+
if (marker.version !== 1 || marker.fingerprint !== fingerprint(databasePath))
|
|
12
|
+
return false;
|
|
13
|
+
for (const suffix of ["-wal", "-journal"]) {
|
|
14
|
+
try {
|
|
15
|
+
if (statSync(`${databasePath}${suffix}`).size > 0)
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
if (error.code !== "ENOENT")
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export function forgetCatalogCompaction(databasePath) {
|
|
30
|
+
try {
|
|
31
|
+
rmSync(markerPath(databasePath), { force: true });
|
|
32
|
+
}
|
|
33
|
+
catch { /* The file fingerprint still rejects markers after a catalog write. */ }
|
|
34
|
+
}
|
|
35
|
+
export function rememberCatalogCompaction(databasePath) {
|
|
36
|
+
const temporary = `${markerPath(databasePath)}-${randomUUID()}.tmp`;
|
|
37
|
+
try {
|
|
38
|
+
writeFileSync(temporary, `${JSON.stringify({ version: 1, fingerprint: fingerprint(databasePath) })}\n`);
|
|
39
|
+
renameSync(temporary, markerPath(databasePath));
|
|
40
|
+
}
|
|
41
|
+
catch { /* Missing maintenance metadata falls back to automatic GC. */ }
|
|
42
|
+
finally {
|
|
43
|
+
try {
|
|
44
|
+
rmSync(temporary, { force: true });
|
|
45
|
+
}
|
|
46
|
+
catch { /* Best-effort cleanup. */ }
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=catalog-gc-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-gc-state.js","sourceRoot":"","sources":["../src/catalog-gc-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEpF,SAAS,WAAW,CAAC,YAAoB;IACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,UAAU,CAAC,YAAoB,IAAY,OAAO,GAAG,YAAY,UAAU,CAAC,CAAC,CAAC;AAEvF,MAAM,UAAU,kBAAkB,CAAC,YAAoB;IACrD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,CAAiD,CAAC;QAC1H,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,IAAI,MAAM,CAAC,WAAW,KAAK,WAAW,CAAC,YAAY,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3F,KAAK,MAAM,MAAM,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC;gBAAC,IAAI,QAAQ,CAAC,GAAG,YAAY,GAAG,MAAM,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC;oBAAE,OAAO,KAAK,CAAC;YAAC,CAAC;YACxE,OAAO,KAAK,EAAE,CAAC;gBAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;oBAAE,OAAO,KAAK,CAAC;YAAC,CAAC;QACzF,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,YAAoB;IAC1D,IAAI,CAAC;QAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAAC,CAAC;IAC1D,MAAM,CAAC,CAAC,uEAAuE,CAAC,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,YAAoB;IAC5D,MAAM,SAAS,GAAG,GAAG,UAAU,CAAC,YAAY,CAAC,IAAI,UAAU,EAAE,MAAM,CAAC;IACpE,IAAI,CAAC;QACH,aAAa,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACxG,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC,CAAC,8DAA8D,CAAC,CAAC;YAClE,CAAC;QACP,IAAI,CAAC;YAAC,MAAM,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,0BAA0B,CAAC,CAAC;IAClF,CAAC;AACH,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { NotebookCell } from "./notebook/types.js";
|
|
2
|
-
export declare const SCHEMA_VERSION =
|
|
2
|
+
export declare const SCHEMA_VERSION = 24;
|
|
3
3
|
export declare const CELLS_TABLE_SCHEMA: readonly [{
|
|
4
4
|
readonly column: "notebook_id";
|
|
5
5
|
readonly type: "TEXT";
|
|
@@ -10,7 +10,7 @@ export declare const CELLS_TABLE_SCHEMA: readonly [{
|
|
|
10
10
|
readonly column: "type";
|
|
11
11
|
readonly type: "TEXT";
|
|
12
12
|
}, {
|
|
13
|
-
readonly column: "
|
|
13
|
+
readonly column: "label";
|
|
14
14
|
readonly type: "TEXT";
|
|
15
15
|
}, {
|
|
16
16
|
readonly column: "grid_row";
|
package/dist/catalog-metadata.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export const SCHEMA_VERSION =
|
|
1
|
+
export const SCHEMA_VERSION = 24;
|
|
2
2
|
export const CELLS_TABLE_SCHEMA = [
|
|
3
3
|
{ column: "notebook_id", type: "TEXT" },
|
|
4
4
|
{ column: "cell_id", type: "TEXT" },
|
|
5
5
|
{ column: "type", type: "TEXT" },
|
|
6
|
-
{ column: "
|
|
6
|
+
{ column: "label", type: "TEXT" },
|
|
7
7
|
{ column: "grid_row", type: "INTEGER" },
|
|
8
8
|
{ column: "grid_column", type: "INTEGER" },
|
|
9
9
|
{ column: "output_entity_id", type: "TEXT" },
|
|
@@ -21,7 +21,7 @@ export function notebookCellTableRows(notebookId, cell) {
|
|
|
21
21
|
notebook_id: notebookId,
|
|
22
22
|
cell_id: cell.id,
|
|
23
23
|
type: cell.type,
|
|
24
|
-
|
|
24
|
+
label: cell.label ?? null,
|
|
25
25
|
grid_row: cell.slot.row,
|
|
26
26
|
grid_column: cell.slot.column,
|
|
27
27
|
output_entity_id: cell.outputEntityId ?? null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog-metadata.js","sourceRoot":"","sources":["../src/catalog-metadata.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AAEjC,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE;IACvC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE;IACnC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;IAChC,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"catalog-metadata.js","sourceRoot":"","sources":["../src/catalog-metadata.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AAEjC,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE;IACvC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE;IACnC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;IAChC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE;IACjC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE;IACvC,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE;IAC1C,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,EAAE;IAC5C,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE;IAClC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE;IACpC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE;IACjC,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE;IACrC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;IAChC,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE;IACvC,EAAE,MAAM,EAAE,oBAAoB,EAAE,IAAI,EAAE,MAAM,EAAE;CACtC,CAAC;AAKX,MAAM,CAAC,MAAM,mBAAmB,GAC9B,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;AASjD,MAAM,UAAU,qBAAqB,CACnC,UAAkB,EAClB,IAAkB;IAElB,MAAM,MAAM,GAA4C;QACtD,WAAW,EAAE,UAAU;QACvB,OAAO,EAAE,IAAI,CAAC,EAAE;QAChB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;QACzB,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG;QACvB,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM;QAC7B,gBAAgB,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI;QAC7C,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;QAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI;QAC/B,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;QACzB,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI;QACjC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI;QACvB,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;QAC9C,kBAAkB,EAAE,IAAI,CAAC,gBAAgB,IAAI,IAAI;KAClD,CAAC;IACF,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACnD,MAAM;QACN,IAAI;QACJ,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;KACtB,CAAC,CAAC,CAAC;AACN,CAAC"}
|
package/dist/context.d.ts
CHANGED
|
@@ -3,12 +3,12 @@ import { ObjectStore } from "./cas.js";
|
|
|
3
3
|
import { DoltStore } from "./store.js";
|
|
4
4
|
interface BookRow {
|
|
5
5
|
book_id: string;
|
|
6
|
-
|
|
6
|
+
name: string;
|
|
7
7
|
created_at: number;
|
|
8
8
|
}
|
|
9
9
|
export interface ArtifactRow {
|
|
10
10
|
artifact_id: string;
|
|
11
|
-
|
|
11
|
+
label: string | null;
|
|
12
12
|
kind: ArtifactKind;
|
|
13
13
|
created_at: number;
|
|
14
14
|
}
|
|
@@ -23,7 +23,9 @@ export declare class EngineContext {
|
|
|
23
23
|
readonly store: DoltStore;
|
|
24
24
|
readonly objects: ObjectStore;
|
|
25
25
|
readonly config: EngineConfig;
|
|
26
|
+
private readonly localMediaScope;
|
|
26
27
|
constructor(config: EngineConfig);
|
|
28
|
+
withLocalMedia<T>(operation: () => T): T;
|
|
27
29
|
/**
|
|
28
30
|
* Whether the object row carries a forget tombstone. Forgotten bytes must
|
|
29
31
|
* never be resurrected — not even from a configured remote store — so
|
|
@@ -32,15 +34,13 @@ export declare class EngineContext {
|
|
|
32
34
|
isForgottenObject(hash: string): boolean;
|
|
33
35
|
bookRow(): BookRow;
|
|
34
36
|
book(row?: BookRow): Book;
|
|
35
|
-
artifactRow(
|
|
37
|
+
artifactRow(artifactId: string): ArtifactRow;
|
|
36
38
|
artifactRowById(artifactId: string): ArtifactRow;
|
|
37
39
|
artifact(row: ArtifactRow): Artifact;
|
|
38
40
|
artifactPath(artifactId: string): string;
|
|
39
41
|
ensureArtifactWorkspace(artifactId: string): string;
|
|
40
42
|
close(): void;
|
|
41
43
|
}
|
|
42
|
-
export declare function normalizeBookSlug(input: string): string;
|
|
43
|
-
export declare function isValidBookSlug(input: string): boolean;
|
|
44
44
|
export declare function resultOf<T>(work: () => Promise<Result<T, EngineError> | T>): Promise<Result<T, EngineError>>;
|
|
45
45
|
export declare function syncResultOf<T>(work: () => T): Result<T, EngineError>;
|
|
46
46
|
export {};
|
package/dist/context.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,QAAQ,EACR,YAAY,EACZ,IAAI,EACJ,YAAY,EACZ,WAAW,EACX,MAAM,EACP,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,SAAS,EAAe,MAAM,YAAY,CAAC;AAEpD,UAAU,OAAO;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,OAAO;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,aAAa;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoC;gBAExD,MAAM,EAAE,YAAY;IA2DhC,cAAc,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC;IAIxC;;;;OAIG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IASxC,OAAO,IAAI,OAAO;IAalB,IAAI,CAAC,GAAG,UAAiB,GAAG,IAAI;IAQhC,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW;IAI5C,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW;IAiBhD,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG,QAAQ;IAUpC,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAIxC,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAMnD,KAAK,IAAI,IAAI;CAGd;AAmDD,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,IAAI,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,GAC9C,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAUjC;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,CAMrE"}
|
package/dist/context.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
1
2
|
import { existsSync, mkdirSync } from "node:fs";
|
|
2
3
|
import * as path from "node:path";
|
|
3
4
|
import { v7 as uuidv7 } from "uuid";
|
|
@@ -8,6 +9,7 @@ export class EngineContext {
|
|
|
8
9
|
store;
|
|
9
10
|
objects;
|
|
10
11
|
config;
|
|
12
|
+
localMediaScope = new AsyncLocalStorage();
|
|
11
13
|
constructor(config) {
|
|
12
14
|
const storage = config.rootDir !== undefined
|
|
13
15
|
? {
|
|
@@ -32,16 +34,14 @@ export class EngineContext {
|
|
|
32
34
|
const databasePath = path.join(storage.dataDir, "videobook.db");
|
|
33
35
|
const initialBook = !existsSync(databasePath)
|
|
34
36
|
? (() => {
|
|
35
|
-
|
|
37
|
+
const name = config.initialBookName?.trim();
|
|
38
|
+
if (!name) {
|
|
36
39
|
throw new EngineFault({
|
|
37
40
|
code: "INVALID_INPUT",
|
|
38
|
-
message: "
|
|
41
|
+
message: "initialBookName is required when creating a new engine root",
|
|
39
42
|
});
|
|
40
43
|
}
|
|
41
|
-
return {
|
|
42
|
-
bookId: uuidv7(),
|
|
43
|
-
slug: normalizeBookSlug(config.initialBookSlug),
|
|
44
|
-
};
|
|
44
|
+
return { bookId: uuidv7(), name };
|
|
45
45
|
})()
|
|
46
46
|
: undefined;
|
|
47
47
|
if (config.identity)
|
|
@@ -55,8 +55,12 @@ export class EngineContext {
|
|
|
55
55
|
? { author: `${config.identity.name} <${config.identity.email}>` }
|
|
56
56
|
: {}),
|
|
57
57
|
...(config.catalogBackup ? { catalogBackup: config.catalogBackup } : {}),
|
|
58
|
+
...(config.catalogGc ? { catalogGc: config.catalogGc } : {}),
|
|
58
59
|
});
|
|
59
|
-
this.objects = new ObjectStore(this.store.objectsDir, config.remoteObjects, config.objectPrefix, (hash) => this.isForgottenObject(hash));
|
|
60
|
+
this.objects = new ObjectStore(this.store.objectsDir, config.remoteObjects, config.objectPrefix, (hash) => this.isForgottenObject(hash), () => this.localMediaScope.getStore() !== true);
|
|
61
|
+
}
|
|
62
|
+
withLocalMedia(operation) {
|
|
63
|
+
return this.localMediaScope.run(true, operation);
|
|
60
64
|
}
|
|
61
65
|
/**
|
|
62
66
|
* Whether the object row carries a forget tombstone. Forgotten bytes must
|
|
@@ -71,7 +75,7 @@ export class EngineContext {
|
|
|
71
75
|
}
|
|
72
76
|
bookRow() {
|
|
73
77
|
const row = this.store.db
|
|
74
|
-
.prepare("SELECT book_id,
|
|
78
|
+
.prepare("SELECT book_id, name, created_at FROM book")
|
|
75
79
|
.get();
|
|
76
80
|
if (!row) {
|
|
77
81
|
throw new EngineFault({
|
|
@@ -84,29 +88,16 @@ export class EngineContext {
|
|
|
84
88
|
book(row = this.bookRow()) {
|
|
85
89
|
return {
|
|
86
90
|
bookId: row.book_id,
|
|
87
|
-
|
|
91
|
+
name: row.name,
|
|
88
92
|
createdAt: row.created_at,
|
|
89
93
|
};
|
|
90
94
|
}
|
|
91
|
-
artifactRow(
|
|
92
|
-
|
|
93
|
-
.prepare(`SELECT artifact_id, slug, kind, created_at
|
|
94
|
-
FROM artifacts
|
|
95
|
-
WHERE artifact_id = ? OR slug = ?
|
|
96
|
-
ORDER BY CASE WHEN artifact_id = ? THEN 0 ELSE 1 END
|
|
97
|
-
LIMIT 1`)
|
|
98
|
-
.get(reference, reference, reference);
|
|
99
|
-
if (!row) {
|
|
100
|
-
throw new EngineFault({
|
|
101
|
-
code: "NOT_FOUND",
|
|
102
|
-
message: `Artifact not found: ${reference}`,
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
return row;
|
|
95
|
+
artifactRow(artifactId) {
|
|
96
|
+
return this.artifactRowById(artifactId);
|
|
106
97
|
}
|
|
107
98
|
artifactRowById(artifactId) {
|
|
108
99
|
const row = this.store.db
|
|
109
|
-
.prepare(`SELECT artifact_id,
|
|
100
|
+
.prepare(`SELECT artifact_id, label, kind, created_at
|
|
110
101
|
FROM artifacts
|
|
111
102
|
WHERE artifact_id = ?`)
|
|
112
103
|
.get(artifactId);
|
|
@@ -121,7 +112,7 @@ export class EngineContext {
|
|
|
121
112
|
artifact(row) {
|
|
122
113
|
return {
|
|
123
114
|
artifactId: row.artifact_id,
|
|
124
|
-
|
|
115
|
+
...(row.label === null ? {} : { label: row.label }),
|
|
125
116
|
kind: row.kind,
|
|
126
117
|
createdAt: row.created_at,
|
|
127
118
|
path: this.artifactPath(row.artifact_id),
|
|
@@ -155,33 +146,10 @@ function assertValidIdentity(identity) {
|
|
|
155
146
|
});
|
|
156
147
|
}
|
|
157
148
|
}
|
|
158
|
-
export function normalizeBookSlug(input) {
|
|
159
|
-
const slug = input
|
|
160
|
-
.trim()
|
|
161
|
-
.toLowerCase()
|
|
162
|
-
.replace(/[^a-z0-9]+/g, "-")
|
|
163
|
-
.replace(/^-+|-+$/g, "");
|
|
164
|
-
if (!slug || !/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(slug)) {
|
|
165
|
-
throw new Error(`Invalid book slug: ${input}`);
|
|
166
|
-
}
|
|
167
|
-
return slug;
|
|
168
|
-
}
|
|
169
|
-
export function isValidBookSlug(input) {
|
|
170
|
-
try {
|
|
171
|
-
return normalizeBookSlug(input) === input;
|
|
172
|
-
}
|
|
173
|
-
catch {
|
|
174
|
-
return false;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
149
|
function toError(error) {
|
|
178
150
|
if (error instanceof EngineFault)
|
|
179
151
|
return error.error;
|
|
180
152
|
const message = error instanceof Error ? error.message : String(error);
|
|
181
|
-
if (message.includes("artifacts_active_slug") ||
|
|
182
|
-
/UNIQUE constraint failed: artifacts\.slug/i.test(message)) {
|
|
183
|
-
return { code: "SLUG_CONFLICT", message };
|
|
184
|
-
}
|
|
185
153
|
if (/UNIQUE constraint failed/i.test(message)) {
|
|
186
154
|
return { code: "ALREADY_EXISTS", message };
|
|
187
155
|
}
|
package/dist/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAUpC,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAuBpD,MAAM,OAAO,aAAa;IACf,KAAK,CAAY;IACjB,OAAO,CAAc;IACrB,MAAM,CAAe;
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
package/dist/domain.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { EntityDocument, EntityType, NotebookCell, NotebookDocument, NotebookEdge, NotebookRun } from "./notebook/types.js";
|
|
1
|
+
import type { EntityDocument, EntityType, NotebookCell, NotebookCellExecution, NotebookDocument, NotebookEdge, NotebookRun } from "./notebook/types.js";
|
|
2
2
|
import type { EngineError, Result, Revision } from "./engine-types.js";
|
|
3
3
|
import { EngineContext } from "./context.js";
|
|
4
4
|
type NewNotebookCell = Omit<NotebookCell, "id"> & {
|
|
@@ -16,13 +16,46 @@ export declare function createEntitiesApi(context: EngineContext): {
|
|
|
16
16
|
entityId: string;
|
|
17
17
|
}, EngineError>>;
|
|
18
18
|
};
|
|
19
|
+
export type WriteNotebookOptions = {
|
|
20
|
+
operation?: string;
|
|
21
|
+
details?: Record<string, unknown>;
|
|
22
|
+
artifactId?: string;
|
|
23
|
+
};
|
|
24
|
+
export type CellHistoryEntry = {
|
|
25
|
+
commitHash: string;
|
|
26
|
+
commitDate: string;
|
|
27
|
+
committer: string;
|
|
28
|
+
operation?: string;
|
|
29
|
+
operationId?: string;
|
|
30
|
+
artifactId?: string;
|
|
31
|
+
details?: Record<string, unknown>;
|
|
32
|
+
cell: NotebookCell;
|
|
33
|
+
};
|
|
34
|
+
export type ExecutionHistoryEntry = {
|
|
35
|
+
commitHash: string;
|
|
36
|
+
commitDate: string;
|
|
37
|
+
committer: string;
|
|
38
|
+
operation?: string;
|
|
39
|
+
operationId?: string;
|
|
40
|
+
artifactId?: string;
|
|
41
|
+
details?: Record<string, unknown>;
|
|
42
|
+
execution: NotebookCellExecution;
|
|
43
|
+
cellId: string;
|
|
44
|
+
notebookId: string;
|
|
45
|
+
};
|
|
19
46
|
export declare function createNotebooksApi(context: EngineContext): {
|
|
20
47
|
create: (name: string) => Promise<Result<NotebookDocument, EngineError>>;
|
|
21
48
|
createCell: (input: NewNotebookCell) => NotebookCell;
|
|
22
49
|
createEdge: (input: NewNotebookEdge) => NotebookEdge;
|
|
23
50
|
list: () => NotebookDocument[];
|
|
24
51
|
read: (notebookId: string) => Result<NotebookDocument, EngineError>;
|
|
25
|
-
write: (notebook: NotebookDocument) => Promise<Result<Revision, EngineError>>;
|
|
52
|
+
write: (notebook: NotebookDocument, options?: WriteNotebookOptions) => Promise<Result<Revision, EngineError>>;
|
|
53
|
+
cellHistory: (notebookId: string, cellId: string, options?: {
|
|
54
|
+
limit?: number;
|
|
55
|
+
}) => CellHistoryEntry[];
|
|
56
|
+
executionHistory: (notebookId: string, cellId: string, options?: {
|
|
57
|
+
limit?: number;
|
|
58
|
+
}) => ExecutionHistoryEntry[];
|
|
26
59
|
insertCell: (notebookId: string, cell: NotebookCell) => Promise<Result<Revision, EngineError>>;
|
|
27
60
|
updateCell: (notebookId: string, cell: NotebookCell) => Promise<Result<Revision, EngineError>>;
|
|
28
61
|
moveCell: (notebookId: string, cellId: string, slot: NotebookCell["slot"]) => Promise<Result<Revision, EngineError>>;
|
package/dist/domain.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domain.d.ts","sourceRoot":"","sources":["../src/domain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EACV,YAAY,
|
|
1
|
+
{"version":3,"file":"domain.d.ts","sourceRoot":"","sources":["../src/domain.ts"],"names":[],"mappings":"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"}
|