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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-cache-paths.js","sourceRoot":"","sources":["../src/model-cache-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE3C,MAAM,UAAU,qBAAqB,CAAC,QAAgB,EAAE,UAAkB;IACxE,OAAO,IAAI,CAAC,QAAQ,EAAE,oBAAoB,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Xenova/clip-vit-base-patch32/d15189d7028b43f1d3e65039190477f6af591c2a": {
|
|
3
|
+
".gitattributes": {
|
|
4
|
+
"algorithm": "git-sha1",
|
|
5
|
+
"digest": "c7d9f3332a950355d5a77d85000f05e6f45435ea",
|
|
6
|
+
"size": 1477
|
|
7
|
+
},
|
|
8
|
+
"README.md": {
|
|
9
|
+
"algorithm": "git-sha1",
|
|
10
|
+
"digest": "408169643667155a04db6336ba636c52de2ecaad",
|
|
11
|
+
"size": 1404
|
|
12
|
+
},
|
|
13
|
+
"config.json": {
|
|
14
|
+
"algorithm": "git-sha1",
|
|
15
|
+
"digest": "e79bad158b04c235740f9b2ec320b17f4030f7a5",
|
|
16
|
+
"size": 4524
|
|
17
|
+
},
|
|
18
|
+
"merges.txt": {
|
|
19
|
+
"algorithm": "git-sha1",
|
|
20
|
+
"digest": "76e821f1b6f0a9709293c3b6b51ed90980b3166b",
|
|
21
|
+
"size": 524619
|
|
22
|
+
},
|
|
23
|
+
"onnx/model.onnx": {
|
|
24
|
+
"algorithm": "sha256",
|
|
25
|
+
"digest": "8ac34fc990f890b4bec8d197de81f956fb135a65067e77fadbf8f053656ed711",
|
|
26
|
+
"size": 605799029
|
|
27
|
+
},
|
|
28
|
+
"onnx/model_bnb4.onnx": {
|
|
29
|
+
"algorithm": "sha256",
|
|
30
|
+
"digest": "3e70d5ff773c939a1fcfbe135a344141a8711c617af1914cee33c278649cea15",
|
|
31
|
+
"size": 181695925
|
|
32
|
+
},
|
|
33
|
+
"onnx/model_fp16.onnx": {
|
|
34
|
+
"algorithm": "sha256",
|
|
35
|
+
"digest": "b33a72860c26713ff564d36a162be4e968ee1e50b2418f449076c067735d4fab",
|
|
36
|
+
"size": 303515168
|
|
37
|
+
},
|
|
38
|
+
"onnx/model_q4.onnx": {
|
|
39
|
+
"algorithm": "sha256",
|
|
40
|
+
"digest": "1f518bedb1851294737a141e06149883cb289160760224f2da5498886e49d5cb",
|
|
41
|
+
"size": 189403477
|
|
42
|
+
},
|
|
43
|
+
"onnx/model_q4f16.onnx": {
|
|
44
|
+
"algorithm": "sha256",
|
|
45
|
+
"digest": "0fa5651801a45889d15576d445b23172f706be5b5d17f6d96a61b486cf4a5252",
|
|
46
|
+
"size": 125818295
|
|
47
|
+
},
|
|
48
|
+
"onnx/model_quantized.onnx": {
|
|
49
|
+
"algorithm": "sha256",
|
|
50
|
+
"digest": "0898a3facfdb27f0a041e57649b4989cfd094e4a0040d6ae75ed69917dfc7328",
|
|
51
|
+
"size": 153695702
|
|
52
|
+
},
|
|
53
|
+
"onnx/model_uint8.onnx": {
|
|
54
|
+
"algorithm": "sha256",
|
|
55
|
+
"digest": "4ac011172c8c022937bb83dad2e8fc207f52f19972b36e14808cc3c8042c4e60",
|
|
56
|
+
"size": 152738540
|
|
57
|
+
},
|
|
58
|
+
"onnx/text_model.onnx": {
|
|
59
|
+
"algorithm": "sha256",
|
|
60
|
+
"digest": "3f6571f5bad13a97c469c1622e1cfc4d9aef78b79fdbfcff804ca357bfada8cc",
|
|
61
|
+
"size": 254058553
|
|
62
|
+
},
|
|
63
|
+
"onnx/text_model_bnb4.onnx": {
|
|
64
|
+
"algorithm": "sha256",
|
|
65
|
+
"digest": "b7c2b531428f0a71a0510252ce9157b2c0fd2400dd0e21aed2e2313cc0e36164",
|
|
66
|
+
"size": 123367012
|
|
67
|
+
},
|
|
68
|
+
"onnx/text_model_fp16.onnx": {
|
|
69
|
+
"algorithm": "sha256",
|
|
70
|
+
"digest": "df587ffbf248bf20d44fa6e16adc5ebc27ead691860e5333dbdaab5fd6bf3f6e",
|
|
71
|
+
"size": 127339794
|
|
72
|
+
},
|
|
73
|
+
"onnx/text_model_int8.onnx": {
|
|
74
|
+
"algorithm": "sha256",
|
|
75
|
+
"digest": "18845f2ccc35223bb7fec403383a131154b11ac0918df25cf51986df5efd3a21",
|
|
76
|
+
"size": 64070791
|
|
77
|
+
},
|
|
78
|
+
"onnx/text_model_q4.onnx": {
|
|
79
|
+
"algorithm": "sha256",
|
|
80
|
+
"digest": "e4ccd15d806b8af841a036884b42034535d58e04c52df00f56e73f72d3c166d5",
|
|
81
|
+
"size": 125742108
|
|
82
|
+
},
|
|
83
|
+
"onnx/text_model_q4f16.onnx": {
|
|
84
|
+
"algorithm": "sha256",
|
|
85
|
+
"digest": "7640460b1389da7d4fa3b3ebcc80299fbe6850b209a009b5067d25c4a9d027d2",
|
|
86
|
+
"size": 72531963
|
|
87
|
+
},
|
|
88
|
+
"onnx/text_model_quantized.onnx": {
|
|
89
|
+
"algorithm": "sha256",
|
|
90
|
+
"digest": "73baab855d406190da9faa498cfedf65f15cf309f4cc7385b7b032e6d08e5c3a",
|
|
91
|
+
"size": 64504507
|
|
92
|
+
},
|
|
93
|
+
"onnx/text_model_uint8.onnx": {
|
|
94
|
+
"algorithm": "sha256",
|
|
95
|
+
"digest": "cbe64fd9eaa6324d49006ce99c104107fdf6b26d25bebff96ecbb5d8a24c5e54",
|
|
96
|
+
"size": 64070835
|
|
97
|
+
},
|
|
98
|
+
"onnx/vision_model.onnx": {
|
|
99
|
+
"algorithm": "sha256",
|
|
100
|
+
"digest": "fd6e1402a588279d1723c7534d4bcba5bc0b14b47dfab0e46f8c47b8270d7d40",
|
|
101
|
+
"size": 351685709
|
|
102
|
+
},
|
|
103
|
+
"onnx/vision_model_bnb4.onnx": {
|
|
104
|
+
"algorithm": "sha256",
|
|
105
|
+
"digest": "d37c9d4463a3ade0bd069e2d35af22f6cbe71ca6e64ad922dbd4f5b2cba9243e",
|
|
106
|
+
"size": 58310402
|
|
107
|
+
},
|
|
108
|
+
"onnx/vision_model_fp16.onnx": {
|
|
109
|
+
"algorithm": "sha256",
|
|
110
|
+
"digest": "35c4e0fb0aeee527dcde1693520b214a34424a786babd530f35366bad5844efd",
|
|
111
|
+
"size": 176080659
|
|
112
|
+
},
|
|
113
|
+
"onnx/vision_model_int8.onnx": {
|
|
114
|
+
"algorithm": "sha256",
|
|
115
|
+
"digest": "0ab0c1b3ace708e539633af1744d5a95247fe4e14d3e08ff197ef82a6cb9bd93",
|
|
116
|
+
"size": 88648877
|
|
117
|
+
},
|
|
118
|
+
"onnx/vision_model_q4.onnx": {
|
|
119
|
+
"algorithm": "sha256",
|
|
120
|
+
"digest": "0769eb1d2f6f68927bbfa6e5330df4c4c3c112f89cd43eae28baafa9e6bd34b4",
|
|
121
|
+
"size": 63642858
|
|
122
|
+
},
|
|
123
|
+
"onnx/vision_model_q4f16.onnx": {
|
|
124
|
+
"algorithm": "sha256",
|
|
125
|
+
"digest": "d238c4e0afe798c47c5991a046b923c5bcbeed19c2d75d7c0db845ba73bb7b87",
|
|
126
|
+
"size": 53267374
|
|
127
|
+
},
|
|
128
|
+
"onnx/vision_model_quantized.onnx": {
|
|
129
|
+
"algorithm": "sha256",
|
|
130
|
+
"digest": "583fd1110a514667812fee7d684952aaf82a99b959760c8d7dca7e0ab9839299",
|
|
131
|
+
"size": 89117001
|
|
132
|
+
},
|
|
133
|
+
"onnx/vision_model_uint8.onnx": {
|
|
134
|
+
"algorithm": "sha256",
|
|
135
|
+
"digest": "b95448754a6ae56964ec80c570c80bb9863787ee85f51b664abed8c0e5f22a7a",
|
|
136
|
+
"size": 88648915
|
|
137
|
+
},
|
|
138
|
+
"preprocessor_config.json": {
|
|
139
|
+
"algorithm": "git-sha1",
|
|
140
|
+
"digest": "e0675735fd0052745f2f7b7291e4aa7859389998",
|
|
141
|
+
"size": 520
|
|
142
|
+
},
|
|
143
|
+
"special_tokens_map.json": {
|
|
144
|
+
"algorithm": "git-sha1",
|
|
145
|
+
"digest": "2c2130b544c0c5a72d5d00da071ba130a9800fb2",
|
|
146
|
+
"size": 472
|
|
147
|
+
},
|
|
148
|
+
"tokenizer.json": {
|
|
149
|
+
"algorithm": "git-sha1",
|
|
150
|
+
"digest": "bc1f77d20440541dd073ebae6f6c401087c7d34e",
|
|
151
|
+
"size": 2224119
|
|
152
|
+
},
|
|
153
|
+
"tokenizer_config.json": {
|
|
154
|
+
"algorithm": "git-sha1",
|
|
155
|
+
"digest": "c9b2a711cbdd039529fa5a66f1965e13eb14451d",
|
|
156
|
+
"size": 775
|
|
157
|
+
},
|
|
158
|
+
"vocab.json": {
|
|
159
|
+
"algorithm": "git-sha1",
|
|
160
|
+
"digest": "182766ce89b439768edadda342519f33802f5364",
|
|
161
|
+
"size": 862328
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
"Xenova/clap-htsat-unfused/c28f2883575e590e04d3146ff0713c2448d691ba": {
|
|
165
|
+
".gitattributes": {
|
|
166
|
+
"algorithm": "git-sha1",
|
|
167
|
+
"digest": "a6344aac8c09253b3b630fb776ae94478aa0275b",
|
|
168
|
+
"size": 1519
|
|
169
|
+
},
|
|
170
|
+
"README.md": {
|
|
171
|
+
"algorithm": "git-sha1",
|
|
172
|
+
"digest": "5af08cd935c160e0670761f0c069620f32e3fdab",
|
|
173
|
+
"size": 2963
|
|
174
|
+
},
|
|
175
|
+
"config.json": {
|
|
176
|
+
"algorithm": "git-sha1",
|
|
177
|
+
"digest": "21aedc3f9eccb0504cea9e2a68b931ca5853ce3d",
|
|
178
|
+
"size": 699
|
|
179
|
+
},
|
|
180
|
+
"merges.txt": {
|
|
181
|
+
"algorithm": "git-sha1",
|
|
182
|
+
"digest": "226b0752cac7789c48f0cb3ec53eda48b7be36cc",
|
|
183
|
+
"size": 456318
|
|
184
|
+
},
|
|
185
|
+
"onnx/audio_model.onnx": {
|
|
186
|
+
"algorithm": "sha256",
|
|
187
|
+
"digest": "a1c2b43c44f71e0fa841a4b86700886c199bf87699ea45632c4d831bc6c88957",
|
|
188
|
+
"size": 117528416
|
|
189
|
+
},
|
|
190
|
+
"onnx/audio_model_fp16.onnx": {
|
|
191
|
+
"algorithm": "sha256",
|
|
192
|
+
"digest": "65963cfa5e903e0a8df475137252d618663df88ecf0b55a3fb327e6c1ca63a97",
|
|
193
|
+
"size": 60414065
|
|
194
|
+
},
|
|
195
|
+
"onnx/audio_model_quantized.onnx": {
|
|
196
|
+
"algorithm": "sha256",
|
|
197
|
+
"digest": "3fcff2c8824e7bcb83a983f2a49edab3b60cbcf4872ac70efee517355173bd1f",
|
|
198
|
+
"size": 34301667
|
|
199
|
+
},
|
|
200
|
+
"onnx/model.onnx": {
|
|
201
|
+
"algorithm": "sha256",
|
|
202
|
+
"digest": "a8cbfb96dda10259964e678c1557466f925001f66b8cd1b24c84bd88b0f84345",
|
|
203
|
+
"size": 619128635
|
|
204
|
+
},
|
|
205
|
+
"onnx/model_fp16.onnx": {
|
|
206
|
+
"algorithm": "sha256",
|
|
207
|
+
"digest": "9ec27913c473d8ce6367cc40376c27b79899248009d8f6f2ad62110abdcf6124",
|
|
208
|
+
"size": 311602756
|
|
209
|
+
},
|
|
210
|
+
"onnx/model_quantized.onnx": {
|
|
211
|
+
"algorithm": "sha256",
|
|
212
|
+
"digest": "3f559313ec268518193101007fc0569ee4b2cfac03e369091c50adb4795f5c5d",
|
|
213
|
+
"size": 161024085
|
|
214
|
+
},
|
|
215
|
+
"onnx/text_model.onnx": {
|
|
216
|
+
"algorithm": "sha256",
|
|
217
|
+
"digest": "6df7c51f2d78e236a03f2b816e613d538c815639d13644fe7c2124f439da9648",
|
|
218
|
+
"size": 501513769
|
|
219
|
+
},
|
|
220
|
+
"onnx/text_model_fp16.onnx": {
|
|
221
|
+
"algorithm": "sha256",
|
|
222
|
+
"digest": "c1fd1e4cdd02acbcacaafe7a8e608dcfc8f84a00bfea3e2ca7df710957b4c3a5",
|
|
223
|
+
"size": 251029088
|
|
224
|
+
},
|
|
225
|
+
"onnx/text_model_quantized.onnx": {
|
|
226
|
+
"algorithm": "sha256",
|
|
227
|
+
"digest": "1a3df8b197e249816e08415fd040434c44762b2eea7eb7bf8a48a0f0bf3c14e5",
|
|
228
|
+
"size": 126603263
|
|
229
|
+
},
|
|
230
|
+
"preprocessor_config.json": {
|
|
231
|
+
"algorithm": "git-sha1",
|
|
232
|
+
"digest": "e8636819eeb1b19f1e5b6f572eca1a101144062e",
|
|
233
|
+
"size": 541
|
|
234
|
+
},
|
|
235
|
+
"quantize_config.json": {
|
|
236
|
+
"algorithm": "git-sha1",
|
|
237
|
+
"digest": "746b5b26413f609d069f50d602cf2f6efa525570",
|
|
238
|
+
"size": 3044
|
|
239
|
+
},
|
|
240
|
+
"special_tokens_map.json": {
|
|
241
|
+
"algorithm": "git-sha1",
|
|
242
|
+
"digest": "d5698132694f4f1bcff08fa7d937b1701812598e",
|
|
243
|
+
"size": 280
|
|
244
|
+
},
|
|
245
|
+
"tokenizer.json": {
|
|
246
|
+
"algorithm": "git-sha1",
|
|
247
|
+
"digest": "15cffb1a334cf27ccef68b0b6e2bc6f74f1be219",
|
|
248
|
+
"size": 2108774
|
|
249
|
+
},
|
|
250
|
+
"tokenizer_config.json": {
|
|
251
|
+
"algorithm": "git-sha1",
|
|
252
|
+
"digest": "1a6efe5c59e166ece942ce95dad22c72f9850b78",
|
|
253
|
+
"size": 1392
|
|
254
|
+
},
|
|
255
|
+
"vocab.json": {
|
|
256
|
+
"algorithm": "git-sha1",
|
|
257
|
+
"digest": "4ebe4bb3f3114daf2e4cc349f24873a1175a35d7",
|
|
258
|
+
"size": 798293
|
|
259
|
+
}
|
|
260
|
+
},
|
|
261
|
+
"onnx-community/all-MiniLM-L6-v2-ONNX/aff7a1dc4e8a1ea593e6ea21e95c22ef0a25966f": {
|
|
262
|
+
".gitattributes": {
|
|
263
|
+
"algorithm": "git-sha1",
|
|
264
|
+
"digest": "64b13564f7941eb0782c057efbbd78c3f9593b74",
|
|
265
|
+
"size": 1761
|
|
266
|
+
},
|
|
267
|
+
"README.md": {
|
|
268
|
+
"algorithm": "git-sha1",
|
|
269
|
+
"digest": "ba95261ef2a1a479a01e40d5107b7fead1747513",
|
|
270
|
+
"size": 1972
|
|
271
|
+
},
|
|
272
|
+
"config.json": {
|
|
273
|
+
"algorithm": "git-sha1",
|
|
274
|
+
"digest": "ebe38151e286579f65078db2a2efafc79278fe50",
|
|
275
|
+
"size": 794
|
|
276
|
+
},
|
|
277
|
+
"onnx/model.onnx": {
|
|
278
|
+
"algorithm": "sha256",
|
|
279
|
+
"digest": "2f019cf6217537cc4bfc7f5192f21dea1e18445177edaab0bc6163a813e5c7a1",
|
|
280
|
+
"size": 56796
|
|
281
|
+
},
|
|
282
|
+
"onnx/model.onnx_data": {
|
|
283
|
+
"algorithm": "sha256",
|
|
284
|
+
"digest": "60c758432aa596c30a122942dfe594c457d4d713f890926f1c5f920bd496c8de",
|
|
285
|
+
"size": 90261504
|
|
286
|
+
},
|
|
287
|
+
"onnx/model_fp16.onnx": {
|
|
288
|
+
"algorithm": "sha256",
|
|
289
|
+
"digest": "6bf4044cd8469cdb93c19f42c5c547fdd8bd4c50409145ba75ed1f80cf3f5e5e",
|
|
290
|
+
"size": 96443
|
|
291
|
+
},
|
|
292
|
+
"onnx/model_fp16.onnx_data": {
|
|
293
|
+
"algorithm": "sha256",
|
|
294
|
+
"digest": "68486e80f360c88c72cdcc555a60bec94bc74fdf69ba4140dac8c15fcff661f7",
|
|
295
|
+
"size": 45087744
|
|
296
|
+
},
|
|
297
|
+
"onnx/model_q4.onnx": {
|
|
298
|
+
"algorithm": "sha256",
|
|
299
|
+
"digest": "e4dcb918111189b7686147e309379832fce83d4ecbf17c395961749b5788c786",
|
|
300
|
+
"size": 69663
|
|
301
|
+
},
|
|
302
|
+
"onnx/model_q4.onnx_data": {
|
|
303
|
+
"algorithm": "sha256",
|
|
304
|
+
"digest": "56fb7a55115e900196115a74e399beb45c2f41ae00b99525d46fb52935c4ee2a",
|
|
305
|
+
"size": 54429696
|
|
306
|
+
},
|
|
307
|
+
"onnx/model_q4f16.onnx": {
|
|
308
|
+
"algorithm": "sha256",
|
|
309
|
+
"digest": "6297f8bb2f10987bad6f36d06022bb4b4ff5289247654843d599389630fd53dd",
|
|
310
|
+
"size": 109149
|
|
311
|
+
},
|
|
312
|
+
"onnx/model_q4f16.onnx_data": {
|
|
313
|
+
"algorithm": "sha256",
|
|
314
|
+
"digest": "e37a0ad962e125f02213afef98d52a606331a1c95a56c6e01d320fefb83892a2",
|
|
315
|
+
"size": 29826048
|
|
316
|
+
},
|
|
317
|
+
"special_tokens_map.json": {
|
|
318
|
+
"algorithm": "git-sha1",
|
|
319
|
+
"digest": "9bbecc17cabbcbd3112c14d6982b51403b264bfa",
|
|
320
|
+
"size": 695
|
|
321
|
+
},
|
|
322
|
+
"tokenizer.json": {
|
|
323
|
+
"algorithm": "git-sha1",
|
|
324
|
+
"digest": "b3d7c5709c06ce20b82f8f240b3b2c5545f449cb",
|
|
325
|
+
"size": 533808
|
|
326
|
+
},
|
|
327
|
+
"tokenizer_config.json": {
|
|
328
|
+
"algorithm": "git-sha1",
|
|
329
|
+
"digest": "99b96f0727e44fef7241b392cc75014313205609",
|
|
330
|
+
"size": 1463
|
|
331
|
+
},
|
|
332
|
+
"vocab.txt": {
|
|
333
|
+
"algorithm": "git-sha1",
|
|
334
|
+
"digest": "fb140275c155a9c7c5a3b3e0e77a9e839594a938",
|
|
335
|
+
"size": 231508
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ModelWorkerConfiguration } from "./model-worker-protocol.js";
|
|
2
|
+
import { EngineFault } from "./store.js";
|
|
3
|
+
interface ModelFileOptions {
|
|
4
|
+
revision?: string;
|
|
5
|
+
cache_dir?: string | null;
|
|
6
|
+
local_files_only?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare class ModelFileResolver {
|
|
9
|
+
private readonly config;
|
|
10
|
+
private readonly workspace;
|
|
11
|
+
failure?: EngineFault;
|
|
12
|
+
private readonly active;
|
|
13
|
+
private readonly network;
|
|
14
|
+
private stopped;
|
|
15
|
+
private readonly pending;
|
|
16
|
+
private readonly verified;
|
|
17
|
+
private readonly staging;
|
|
18
|
+
constructor(config: ModelWorkerConfiguration, workspace: string);
|
|
19
|
+
get(modelId: string, filename: string, fatal?: boolean, options?: ModelFileOptions, returnPath?: boolean): Promise<string | Uint8Array | null>;
|
|
20
|
+
drainAfterFailure(): Promise<EngineFault | undefined>;
|
|
21
|
+
private getVerified;
|
|
22
|
+
private downloadAllowed;
|
|
23
|
+
private resolveFile;
|
|
24
|
+
private receipt;
|
|
25
|
+
private download;
|
|
26
|
+
private snapshot;
|
|
27
|
+
private publish;
|
|
28
|
+
}
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=model-file-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-file-resolver.d.ts","sourceRoot":"","sources":["../src/model-file-resolver.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,UAAU,gBAAgB;IAAG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE;AAOvG,qBAAa,iBAAiB;IAShB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAA4B,OAAO,CAAC,QAAQ,CAAC,SAAS;IARzF,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkD;IACzE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6C;IACrE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAEJ,MAAM,EAAE,wBAAwB,EAAmB,SAAS,EAAE,MAAM;IAIjG,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,UAAO,EAAE,OAAO,GAAE,gBAAqB,EAAE,UAAU,UAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;IAWvI,iBAAiB,IAAI,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;YAO7C,WAAW;IAqCzB,OAAO,CAAC,eAAe;YAIT,WAAW;YAyCX,OAAO;YAaP,QAAQ;YAuCR,QAAQ;YAkCR,OAAO;CAiBtB"}
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { createReadStream, constants } from "node:fs";
|
|
3
|
+
import { copyFile, mkdir, open, readFile, rename, rm, stat } from "node:fs/promises";
|
|
4
|
+
import { dirname, isAbsolute, join, resolve } from "node:path";
|
|
5
|
+
import checksums from "./model-checksums.json" with { type: "json" };
|
|
6
|
+
import { modelCacheStagingRoot } from "./model-cache-paths.js";
|
|
7
|
+
import { EngineFault } from "./store.js";
|
|
8
|
+
const pinned = checksums;
|
|
9
|
+
const MAX_FILE_BYTES = 2 * 1024 ** 3;
|
|
10
|
+
const MAX_BUFFER_BYTES = 16 * 1024 ** 2;
|
|
11
|
+
export class ModelFileResolver {
|
|
12
|
+
config;
|
|
13
|
+
workspace;
|
|
14
|
+
failure;
|
|
15
|
+
active = new Set();
|
|
16
|
+
network = new AbortController();
|
|
17
|
+
stopped = false;
|
|
18
|
+
pending = new Map();
|
|
19
|
+
verified = new Map();
|
|
20
|
+
staging;
|
|
21
|
+
constructor(config, workspace) {
|
|
22
|
+
this.config = config;
|
|
23
|
+
this.workspace = workspace;
|
|
24
|
+
this.staging = modelCacheStagingRoot(config.modelCacheDir, workspace);
|
|
25
|
+
}
|
|
26
|
+
get(modelId, filename, fatal = true, options = {}, returnPath = false) {
|
|
27
|
+
if (this.stopped)
|
|
28
|
+
return Promise.reject(new EngineFault({ code: "CANCELLED", message: "Model loading stopped after a failure" }));
|
|
29
|
+
const operation = this.getVerified(modelId, filename, fatal, options, returnPath).catch((error) => {
|
|
30
|
+
if (error instanceof EngineFault && ["MODEL_UNAVAILABLE", "RESOURCE_EXHAUSTED"].includes(error.error.code))
|
|
31
|
+
this.failure = error;
|
|
32
|
+
throw error;
|
|
33
|
+
});
|
|
34
|
+
this.active.add(operation);
|
|
35
|
+
void operation.then(() => this.active.delete(operation), () => this.active.delete(operation));
|
|
36
|
+
return operation;
|
|
37
|
+
}
|
|
38
|
+
async drainAfterFailure() {
|
|
39
|
+
this.stopped = true;
|
|
40
|
+
this.network.abort();
|
|
41
|
+
await Promise.allSettled([...this.active]);
|
|
42
|
+
return this.failure;
|
|
43
|
+
}
|
|
44
|
+
async getVerified(modelId, filename, fatal, options, returnPath) {
|
|
45
|
+
safeRelative(filename);
|
|
46
|
+
const revision = options.revision ?? "main";
|
|
47
|
+
safeRelative(revision);
|
|
48
|
+
if ((this.config.modelId !== undefined && modelId !== this.config.modelId)
|
|
49
|
+
|| (this.config.modelRevision !== undefined && revision !== this.config.modelRevision)) {
|
|
50
|
+
throw unavailable("Model file request does not match its worker repository and immutable revision");
|
|
51
|
+
}
|
|
52
|
+
if (options.cache_dir && resolve(options.cache_dir) !== resolve(this.config.modelCacheDir))
|
|
53
|
+
throw unavailable("Model cache scope does not match its worker");
|
|
54
|
+
const key = JSON.stringify([modelId, revision, filename, options.local_files_only === true]);
|
|
55
|
+
let file = this.verified.get(key);
|
|
56
|
+
if (!file) {
|
|
57
|
+
let pending = this.pending.get(key);
|
|
58
|
+
if (!pending) {
|
|
59
|
+
pending = this.resolveFile(modelId, revision, filename, options).then(async (file) => {
|
|
60
|
+
if (!file)
|
|
61
|
+
return null;
|
|
62
|
+
const directory = createHash("sha256").update(JSON.stringify([modelId, revision])).digest("hex");
|
|
63
|
+
const sealed = join(this.workspace, "models", directory, filename);
|
|
64
|
+
await mkdir(dirname(sealed), { recursive: true });
|
|
65
|
+
await rename(file, sealed);
|
|
66
|
+
return sealed;
|
|
67
|
+
}).finally(() => this.pending.delete(key));
|
|
68
|
+
this.pending.set(key, pending);
|
|
69
|
+
}
|
|
70
|
+
file = (await pending) ?? undefined;
|
|
71
|
+
if (file)
|
|
72
|
+
this.verified.set(key, file);
|
|
73
|
+
}
|
|
74
|
+
if (!file) {
|
|
75
|
+
if (!fatal)
|
|
76
|
+
return null;
|
|
77
|
+
if (!this.downloadAllowed(options))
|
|
78
|
+
throw new EngineFault({ code: "OFFLINE", message: "Required model file is missing. Model downloads are disabled; explicitly prepare the model, then retry." });
|
|
79
|
+
throw new EngineFault({ code: "FEATURE_UNAVAILABLE", message: "Required model file is unavailable from the configured snapshot" });
|
|
80
|
+
}
|
|
81
|
+
if (returnPath)
|
|
82
|
+
return file;
|
|
83
|
+
if ((await stat(file)).size > MAX_BUFFER_BYTES)
|
|
84
|
+
throw exhausted("Model metadata exceeds the buffer limit");
|
|
85
|
+
return new Uint8Array(await readFile(file));
|
|
86
|
+
}
|
|
87
|
+
downloadAllowed(options) {
|
|
88
|
+
return this.config.allowModelDownload && this.config.allowRemoteModels && options.local_files_only !== true;
|
|
89
|
+
}
|
|
90
|
+
async resolveFile(modelId, revision, filename, options) {
|
|
91
|
+
if (isAbsolute(modelId)) {
|
|
92
|
+
if (!this.config.allowLocalModels)
|
|
93
|
+
return null;
|
|
94
|
+
const path = join(modelId, filename);
|
|
95
|
+
return await exists(path) ? (await this.snapshot(createReadStream(path))).path : null;
|
|
96
|
+
}
|
|
97
|
+
safeRelative(modelId);
|
|
98
|
+
if (!/^[\w.-]+(?:\/[\w.-]+)?$/u.test(modelId))
|
|
99
|
+
throw unavailable("Invalid model repository identifier");
|
|
100
|
+
const known = pinned[`${modelId}/${revision}`];
|
|
101
|
+
const expected = known?.[filename];
|
|
102
|
+
const cachePath = join(this.config.modelCacheDir, modelId, ...(revision === "main" ? [] : [revision]), filename);
|
|
103
|
+
if (known && !expected) {
|
|
104
|
+
if (await exists(cachePath))
|
|
105
|
+
throw unavailable("Unrecognized file in a pinned model snapshot");
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
if (await exists(cachePath)) {
|
|
109
|
+
const receipt = expected ? undefined : await this.receipt(cachePath, modelId, revision, filename);
|
|
110
|
+
if (expected || receipt)
|
|
111
|
+
return (await this.snapshot(createReadStream(cachePath), expected ?? receipt)).path;
|
|
112
|
+
if (!this.downloadAllowed(options))
|
|
113
|
+
throw new EngineFault({ code: "OFFLINE", message: "Cached model has no integrity metadata. Model downloads are disabled; explicitly prepare the model to verify it." });
|
|
114
|
+
}
|
|
115
|
+
if (this.config.allowLocalModels && this.config.modelRevision === undefined) {
|
|
116
|
+
const localPath = join(this.config.localModelPath, modelId, filename);
|
|
117
|
+
if (await exists(localPath))
|
|
118
|
+
return (await this.snapshot(createReadStream(localPath), expected)).path;
|
|
119
|
+
}
|
|
120
|
+
if (!this.downloadAllowed(options))
|
|
121
|
+
return null;
|
|
122
|
+
const remote = new URL(`${this.config.remoteHost.replace(/\/$/u, "")}/${this.config.remotePathTemplate
|
|
123
|
+
.replaceAll("{model}", modelId).replaceAll("{revision}", encodeURIComponent(revision)).replace(/^\//u, "").replace(/\/$/u, "")}/${filename.split("/").map(encodeURIComponent).join("/")}`);
|
|
124
|
+
const downloaded = await this.download(remote, expected);
|
|
125
|
+
if (!downloaded)
|
|
126
|
+
return null;
|
|
127
|
+
try {
|
|
128
|
+
const metadata = { version: 1, modelId, revision, filename,
|
|
129
|
+
...(downloaded.expected ?? { algorithm: "sha256", digest: downloaded.sha256 }), size: downloaded.size,
|
|
130
|
+
source: downloaded.expected ? "hub-etag" : "transport" };
|
|
131
|
+
await this.publish(cachePath, downloaded.path, metadata);
|
|
132
|
+
return downloaded.path;
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
await rm(downloaded.path, { force: true });
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
async receipt(path, modelId, revision, filename) {
|
|
140
|
+
const receiptPath = `${path}.videobook-integrity.json`;
|
|
141
|
+
if (!await exists(receiptPath))
|
|
142
|
+
return undefined;
|
|
143
|
+
if ((await stat(receiptPath)).size > 16_384)
|
|
144
|
+
throw unavailable("Invalid model integrity metadata");
|
|
145
|
+
let record;
|
|
146
|
+
try {
|
|
147
|
+
record = JSON.parse(await readFile(receiptPath, "utf8"));
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
throw unavailable("Invalid model integrity metadata");
|
|
151
|
+
}
|
|
152
|
+
if (!record || record.version !== 1 || record.modelId !== modelId || record.revision !== revision || record.filename !== filename
|
|
153
|
+
|| !validDigest(record) || !Number.isSafeInteger(record.size) || record.size < 0 || record.size > MAX_FILE_BYTES
|
|
154
|
+
|| !["hub-etag", "transport"].includes(record.source))
|
|
155
|
+
throw unavailable("Invalid model integrity metadata");
|
|
156
|
+
return record;
|
|
157
|
+
}
|
|
158
|
+
async download(initial, expected) {
|
|
159
|
+
let url = initial;
|
|
160
|
+
let upstream;
|
|
161
|
+
for (let redirects = 0; redirects <= 5; redirects++) {
|
|
162
|
+
if (!["http:", "https:"].includes(url.protocol) || url.username || url.password)
|
|
163
|
+
throw unavailable("Unsupported model download URL");
|
|
164
|
+
const headers = new Headers({ "Accept-Encoding": "identity" });
|
|
165
|
+
const token = process.env.HF_TOKEN ?? process.env.HUGGING_FACE_HUB_TOKEN;
|
|
166
|
+
if (token && url.origin === "https://huggingface.co")
|
|
167
|
+
headers.set("Authorization", `Bearer ${token}`);
|
|
168
|
+
const response = await fetch(url, { headers, redirect: "manual", signal: this.network.signal });
|
|
169
|
+
if (redirects === 0)
|
|
170
|
+
upstream = headerDigest(response.headers, response.status === 200);
|
|
171
|
+
if ([301, 302, 303, 307, 308].includes(response.status)) {
|
|
172
|
+
await response.body?.cancel();
|
|
173
|
+
const location = response.headers.get("location");
|
|
174
|
+
if (!location)
|
|
175
|
+
throw unavailable("Model download redirect is missing its location");
|
|
176
|
+
const next = new URL(location, url);
|
|
177
|
+
if (url.protocol === "https:" && next.protocol !== "https:")
|
|
178
|
+
throw unavailable("Model download cannot redirect to an insecure connection");
|
|
179
|
+
url = next;
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
if (response.status !== 200 || !response.body) {
|
|
183
|
+
await response.body?.cancel();
|
|
184
|
+
if (response.status === 404)
|
|
185
|
+
return null;
|
|
186
|
+
throw unavailable("Model download did not return a complete file");
|
|
187
|
+
}
|
|
188
|
+
if (expected && upstream && (expected.algorithm !== upstream.algorithm || expected.digest !== upstream.digest)) {
|
|
189
|
+
await response.body.cancel();
|
|
190
|
+
throw unavailable("Model metadata does not match the pinned checksum");
|
|
191
|
+
}
|
|
192
|
+
const digest = expected ?? upstream;
|
|
193
|
+
const length = Number(response.headers.get("content-length"));
|
|
194
|
+
if ((digest?.size ?? 0) > MAX_FILE_BYTES || length > MAX_FILE_BYTES) {
|
|
195
|
+
await response.body.cancel();
|
|
196
|
+
throw exhausted("Model download exceeds the file limit");
|
|
197
|
+
}
|
|
198
|
+
return { ...await this.snapshot(response.body, digest), expected: digest };
|
|
199
|
+
}
|
|
200
|
+
throw unavailable("Model download exceeded its redirect limit");
|
|
201
|
+
}
|
|
202
|
+
async snapshot(source, expected) {
|
|
203
|
+
await mkdir(join(this.workspace, "models"), { recursive: true });
|
|
204
|
+
const path = join(this.workspace, "models", randomUUID());
|
|
205
|
+
let size = 0;
|
|
206
|
+
const sha256 = createHash("sha256");
|
|
207
|
+
const output = await open(path, "wx", 0o600);
|
|
208
|
+
try {
|
|
209
|
+
for await (const chunk of source) {
|
|
210
|
+
size += chunk.byteLength;
|
|
211
|
+
if (size > MAX_FILE_BYTES)
|
|
212
|
+
throw exhausted("Model file exceeds the supported size");
|
|
213
|
+
sha256.update(chunk);
|
|
214
|
+
await output.writeFile(chunk);
|
|
215
|
+
}
|
|
216
|
+
await output.sync();
|
|
217
|
+
await output.close();
|
|
218
|
+
const digest = sha256.digest("hex");
|
|
219
|
+
if (expected) {
|
|
220
|
+
if (expected.size !== undefined && expected.size !== size)
|
|
221
|
+
throw unavailable("Model file size does not match its integrity metadata");
|
|
222
|
+
let actual = digest;
|
|
223
|
+
if (expected.algorithm === "git-sha1") {
|
|
224
|
+
const hash = createHash("sha1").update(`blob ${size}\0`);
|
|
225
|
+
for await (const chunk of createReadStream(path))
|
|
226
|
+
hash.update(chunk);
|
|
227
|
+
actual = hash.digest("hex");
|
|
228
|
+
}
|
|
229
|
+
if (actual !== expected.digest)
|
|
230
|
+
throw unavailable("Model checksum verification failed");
|
|
231
|
+
}
|
|
232
|
+
return { path, sha256: digest, size };
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
await output.close().catch(() => undefined);
|
|
236
|
+
await rm(path, { force: true });
|
|
237
|
+
throw error;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
async publish(destination, snapshot, receipt) {
|
|
241
|
+
await mkdir(this.staging, { recursive: true });
|
|
242
|
+
await mkdir(dirname(destination), { recursive: true });
|
|
243
|
+
const temporary = join(this.staging, randomUUID());
|
|
244
|
+
const metadata = `${temporary}.json`;
|
|
245
|
+
try {
|
|
246
|
+
await copyFile(snapshot, temporary, constants.COPYFILE_FICLONE);
|
|
247
|
+
const output = await open(temporary, "r+");
|
|
248
|
+
try {
|
|
249
|
+
await output.sync();
|
|
250
|
+
}
|
|
251
|
+
finally {
|
|
252
|
+
await output.close();
|
|
253
|
+
}
|
|
254
|
+
const record = await open(metadata, "wx", 0o600);
|
|
255
|
+
try {
|
|
256
|
+
await record.writeFile(JSON.stringify(receipt));
|
|
257
|
+
await record.sync();
|
|
258
|
+
}
|
|
259
|
+
finally {
|
|
260
|
+
await record.close();
|
|
261
|
+
}
|
|
262
|
+
await rename(temporary, destination);
|
|
263
|
+
await rename(metadata, `${destination}.videobook-integrity.json`);
|
|
264
|
+
}
|
|
265
|
+
finally {
|
|
266
|
+
await Promise.all([rm(temporary, { force: true }), rm(metadata, { force: true })]);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
function safeRelative(path) {
|
|
271
|
+
if (!path || isAbsolute(path) || path.includes("\\") || path.includes("\0") || path.split("/").some((part) => !part || part === "." || part === ".."))
|
|
272
|
+
throw unavailable("Invalid model file path");
|
|
273
|
+
}
|
|
274
|
+
async function exists(path) {
|
|
275
|
+
try {
|
|
276
|
+
const file = await stat(path);
|
|
277
|
+
if (!file.isFile())
|
|
278
|
+
throw unavailable("Model path is not a regular file");
|
|
279
|
+
return true;
|
|
280
|
+
}
|
|
281
|
+
catch (error) {
|
|
282
|
+
if (error && typeof error === "object" && "code" in error && error.code === "ENOENT")
|
|
283
|
+
return false;
|
|
284
|
+
throw error;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
function validDigest(value) {
|
|
288
|
+
return value.algorithm === "sha256" ? /^[a-f0-9]{64}$/u.test(value.digest)
|
|
289
|
+
: value.algorithm === "git-sha1" && /^[a-f0-9]{40}$/u.test(value.digest);
|
|
290
|
+
}
|
|
291
|
+
function headerDigest(headers, complete) {
|
|
292
|
+
const tag = (headers.get("x-linked-etag") ?? headers.get("etag"))?.replace(/^"|"$/gu, "");
|
|
293
|
+
if (!tag)
|
|
294
|
+
return undefined;
|
|
295
|
+
const algorithm = /^[a-f0-9]{64}$/iu.test(tag) ? "sha256" : /^[a-f0-9]{40}$/iu.test(tag) ? "git-sha1" : undefined;
|
|
296
|
+
if (!algorithm)
|
|
297
|
+
return undefined;
|
|
298
|
+
const rawSize = headers.get("x-linked-size") ?? (complete && !headers.get("content-encoding") ? headers.get("content-length") : null);
|
|
299
|
+
const size = rawSize === null ? undefined : Number(rawSize);
|
|
300
|
+
return { algorithm, digest: tag.toLowerCase(), ...(Number.isSafeInteger(size) && size >= 0 ? { size } : {}) };
|
|
301
|
+
}
|
|
302
|
+
function unavailable(message) { return new EngineFault({ code: "MODEL_UNAVAILABLE", message }); }
|
|
303
|
+
function exhausted(message) { return new EngineFault({ code: "RESOURCE_EXHAUSTED", message }); }
|
|
304
|
+
//# sourceMappingURL=model-file-resolver.js.map
|