@avantf/dsh-plugin-base 0.3.1
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/LICENSE +21 -0
- package/README.md +303 -0
- package/dist/artifact.d.ts +29 -0
- package/dist/artifact.d.ts.map +1 -0
- package/dist/artifact.js +60 -0
- package/dist/artifact.js.map +1 -0
- package/dist/bootstrap.d.ts +54 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +334 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +37 -0
- package/dist/cli.js.map +1 -0
- package/dist/compat.d.ts +413 -0
- package/dist/compat.d.ts.map +1 -0
- package/dist/compat.js +742 -0
- package/dist/compat.js.map +1 -0
- package/dist/conformance.d.ts +55 -0
- package/dist/conformance.d.ts.map +1 -0
- package/dist/conformance.js +702 -0
- package/dist/conformance.js.map +1 -0
- package/dist/errors.d.ts +26 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +28 -0
- package/dist/errors.js.map +1 -0
- package/dist/fs.d.ts +18 -0
- package/dist/fs.d.ts.map +1 -0
- package/dist/fs.js +152 -0
- package/dist/fs.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/integrity.d.ts +5 -0
- package/dist/integrity.d.ts.map +1 -0
- package/dist/integrity.js +33 -0
- package/dist/integrity.js.map +1 -0
- package/dist/interface.d.ts +262 -0
- package/dist/interface.d.ts.map +1 -0
- package/dist/interface.js +136 -0
- package/dist/interface.js.map +1 -0
- package/dist/interface_gate.d.ts +61 -0
- package/dist/interface_gate.d.ts.map +1 -0
- package/dist/interface_gate.js +103 -0
- package/dist/interface_gate.js.map +1 -0
- package/dist/internal.d.ts +23 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +18 -0
- package/dist/internal.js.map +1 -0
- package/dist/kit/family.d.ts +52 -0
- package/dist/kit/family.d.ts.map +1 -0
- package/dist/kit/family.js +65 -0
- package/dist/kit/family.js.map +1 -0
- package/dist/kit/index.d.ts +26 -0
- package/dist/kit/index.d.ts.map +1 -0
- package/dist/kit/index.js +26 -0
- package/dist/kit/index.js.map +1 -0
- package/dist/kit/logger.d.ts +41 -0
- package/dist/kit/logger.d.ts.map +1 -0
- package/dist/kit/logger.js +42 -0
- package/dist/kit/logger.js.map +1 -0
- package/dist/kit/prompt_files.d.ts +90 -0
- package/dist/kit/prompt_files.d.ts.map +1 -0
- package/dist/kit/prompt_files.js +121 -0
- package/dist/kit/prompt_files.js.map +1 -0
- package/dist/kit/typert.d.ts +40 -0
- package/dist/kit/typert.d.ts.map +1 -0
- package/dist/kit/typert.js +17 -0
- package/dist/kit/typert.js.map +1 -0
- package/dist/layout.d.ts +28 -0
- package/dist/layout.d.ts.map +1 -0
- package/dist/layout.js +84 -0
- package/dist/layout.js.map +1 -0
- package/dist/lint.d.ts +33 -0
- package/dist/lint.d.ts.map +1 -0
- package/dist/lint.js +271 -0
- package/dist/lint.js.map +1 -0
- package/dist/lock.d.ts +12 -0
- package/dist/lock.d.ts.map +1 -0
- package/dist/lock.js +93 -0
- package/dist/lock.js.map +1 -0
- package/dist/manifest.d.ts +12 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +75 -0
- package/dist/manifest.js.map +1 -0
- package/dist/net.d.ts +23 -0
- package/dist/net.d.ts.map +1 -0
- package/dist/net.js +112 -0
- package/dist/net.js.map +1 -0
- package/dist/package-name.d.ts +3 -0
- package/dist/package-name.d.ts.map +1 -0
- package/dist/package-name.js +13 -0
- package/dist/package-name.js.map +1 -0
- package/dist/preset.d.ts +46 -0
- package/dist/preset.d.ts.map +1 -0
- package/dist/preset.js +230 -0
- package/dist/preset.js.map +1 -0
- package/dist/providers/archive.d.ts +32 -0
- package/dist/providers/archive.d.ts.map +1 -0
- package/dist/providers/archive.js +248 -0
- package/dist/providers/archive.js.map +1 -0
- package/dist/providers/model.d.ts +25 -0
- package/dist/providers/model.d.ts.map +1 -0
- package/dist/providers/model.js +550 -0
- package/dist/providers/model.js.map +1 -0
- package/dist/providers/npm.d.ts +21 -0
- package/dist/providers/npm.d.ts.map +1 -0
- package/dist/providers/npm.js +458 -0
- package/dist/providers/npm.js.map +1 -0
- package/dist/provisioner.d.ts +21 -0
- package/dist/provisioner.d.ts.map +1 -0
- package/dist/provisioner.js +962 -0
- package/dist/provisioner.js.map +1 -0
- package/dist/semver.d.ts +31 -0
- package/dist/semver.d.ts.map +1 -0
- package/dist/semver.js +244 -0
- package/dist/semver.js.map +1 -0
- package/dist/state.d.ts +71 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +225 -0
- package/dist/state.js.map +1 -0
- package/dist/tar.d.ts +10 -0
- package/dist/tar.d.ts.map +1 -0
- package/dist/tar.js +178 -0
- package/dist/tar.js.map +1 -0
- package/dist/types.d.ts +431 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/zip.d.ts +8 -0
- package/dist/zip.d.ts.map +1 -0
- package/dist/zip.js +109 -0
- package/dist/zip.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,550 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The built-in `model-cache` provider.
|
|
3
|
+
* @module providers/model
|
|
4
|
+
*/
|
|
5
|
+
import { createHash } from 'node:crypto';
|
|
6
|
+
import { basename, dirname, join, relative, resolve } from 'node:path';
|
|
7
|
+
import { ProvisionError } from '../errors.js';
|
|
8
|
+
import { ATOMIC_TEMP_PREFIX, exists, sweepAtomicTemps } from '../fs.js';
|
|
9
|
+
import { isInside, lockPath } from '../layout.js';
|
|
10
|
+
import { defaultLock } from '../lock.js';
|
|
11
|
+
import { fetchImplOf, readCapped, signalFor } from '../net.js';
|
|
12
|
+
export const MODEL_CACHE_KIND = 'model-cache';
|
|
13
|
+
const DEFAULT_ENDPOINT = 'https://huggingface.co';
|
|
14
|
+
const DEFAULT_REVISION = 'main';
|
|
15
|
+
/** Maximum bytes read for a single model file. */
|
|
16
|
+
const MAX_MODEL_BYTES = 4 * 1024 * 1024 * 1024;
|
|
17
|
+
/** How long the placement lock waits before reporting `lock/timeout`. */
|
|
18
|
+
const LOCK_TIMEOUT_MS = 15_000;
|
|
19
|
+
/** A placement lock older than this whose pid is gone is reclaimed. */
|
|
20
|
+
const STALE_LOCK_MS = 60_000;
|
|
21
|
+
/** A resolved commit id: 40 or 64 lowercase hex. */
|
|
22
|
+
const SHA_PATTERN = /^(?:[0-9a-f]{40}|[0-9a-f]{64})$/;
|
|
23
|
+
/** A content-addressed blob name: sha256 lowercase hex. */
|
|
24
|
+
const BLOB_PATTERN = /^[0-9a-f]{64}$/;
|
|
25
|
+
/** C0 controls and DEL may not appear in a path segment. */
|
|
26
|
+
const CONTROL_PATTERN = /[\u0000-\u001f\u007f]/;
|
|
27
|
+
/** Monotonic per-process sequence for the same-directory link temps. */
|
|
28
|
+
let linkSequence = 0;
|
|
29
|
+
/** The default layout: the content-addressed snapshot tree. */
|
|
30
|
+
const DEFAULT_LAYOUT = 'hub';
|
|
31
|
+
/** The layout whose files a runtime reads directly at `<root>/<repo>/<file>`. */
|
|
32
|
+
const FLAT_LAYOUT = 'flat';
|
|
33
|
+
/** Sidecar directory under `target.root`; flat state lives here and is never read as model data. */
|
|
34
|
+
const SIDECAR_DIR = '.envinit';
|
|
35
|
+
const RECORD_FILE = 'record.json';
|
|
36
|
+
const RECORD_SCHEMA_VERSION = 1;
|
|
37
|
+
/** Is `value` a resolved commit id? */
|
|
38
|
+
function isSha(value) {
|
|
39
|
+
return typeof value === 'string' && SHA_PATTERN.test(value);
|
|
40
|
+
}
|
|
41
|
+
/** Reject a revision that cannot be a safe single path tree under `refs/`. */
|
|
42
|
+
function assertSafeRevision(revision) {
|
|
43
|
+
if (revision.trim() === '') {
|
|
44
|
+
throw new ProvisionError('invalid-option', `model-cache 的 spec.revision 不能为空:${JSON.stringify(revision)}`);
|
|
45
|
+
}
|
|
46
|
+
if (CONTROL_PATTERN.test(revision) || revision.includes('\\') || revision.startsWith('/')) {
|
|
47
|
+
throw new ProvisionError('invalid-option', `model-cache 的 spec.revision 不安全:${JSON.stringify(revision)}`);
|
|
48
|
+
}
|
|
49
|
+
const parts = revision.split('/');
|
|
50
|
+
if (parts.some(part => part === '' || part === '.' || part === '..')) {
|
|
51
|
+
throw new ProvisionError('invalid-option', `model-cache 的 spec.revision 不得跳出 refs:${JSON.stringify(revision)}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function parseSpec(item) {
|
|
55
|
+
const spec = item.spec;
|
|
56
|
+
if (typeof spec !== 'object' || spec === null || typeof spec.repo !== 'string') {
|
|
57
|
+
throw new ProvisionError('invalid-option', `model-cache 的 spec 必须是 {repo, revision?, layout?}:${String(item.id)}`);
|
|
58
|
+
}
|
|
59
|
+
const layout = spec.layout;
|
|
60
|
+
if (layout !== undefined && layout !== DEFAULT_LAYOUT && layout !== FLAT_LAYOUT) {
|
|
61
|
+
throw new ProvisionError('invalid-option', `model-cache 的 spec.layout 只能是 ${DEFAULT_LAYOUT} 或 ${FLAT_LAYOUT}:${JSON.stringify(layout)}`);
|
|
62
|
+
}
|
|
63
|
+
const revision = spec.revision;
|
|
64
|
+
if (revision !== undefined) {
|
|
65
|
+
if (typeof revision !== 'string') {
|
|
66
|
+
throw new ProvisionError('invalid-option', `model-cache 的 spec.revision 必须是字符串:${JSON.stringify(revision)}`);
|
|
67
|
+
}
|
|
68
|
+
assertSafeRevision(revision);
|
|
69
|
+
}
|
|
70
|
+
const parsed = spec;
|
|
71
|
+
if (parsed.layout === FLAT_LAYOUT)
|
|
72
|
+
assertFlatRepo(parsed.repo);
|
|
73
|
+
return parsed;
|
|
74
|
+
}
|
|
75
|
+
/** An explicitly blank endpoint is a spec error, not a silent fallback to the built-in one. */
|
|
76
|
+
function assertEndpoint(spec) {
|
|
77
|
+
if (spec.endpoint !== undefined && (typeof spec.endpoint !== 'string' || spec.endpoint.trim() === '')) {
|
|
78
|
+
throw new ProvisionError('invalid-option', `model-cache 的 spec.endpoint 不能为空白:${JSON.stringify(spec.endpoint)}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function layoutOf(spec) {
|
|
82
|
+
return spec.layout ?? DEFAULT_LAYOUT;
|
|
83
|
+
}
|
|
84
|
+
/** The `flat` layout joins the repo id onto `target.root`, so every segment must stay inside it. */
|
|
85
|
+
function assertFlatRepo(repo) {
|
|
86
|
+
const normalized = repo.replaceAll('\\', '/');
|
|
87
|
+
const parts = normalized.split('/');
|
|
88
|
+
const unsafe = normalized.startsWith('/') ||
|
|
89
|
+
CONTROL_PATTERN.test(normalized) ||
|
|
90
|
+
parts.some(part => part === '' || part === '.' || part === '..');
|
|
91
|
+
if (unsafe || parts[0] === SIDECAR_DIR) {
|
|
92
|
+
throw new ProvisionError('invalid-option', `${FLAT_LAYOUT} 布局的 repo 必须是安全相对路径,且第一段不得为 ${SIDECAR_DIR}:${JSON.stringify(repo)}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/** Join one repo-relative file name onto `root`, refusing anything that escapes it. */
|
|
96
|
+
function fileUnder(root, file) {
|
|
97
|
+
const parts = file.replaceAll('\\', '/').split('/');
|
|
98
|
+
if (file === '' || file.startsWith('/') || /^[a-zA-Z]:[\\/]/.test(file) || parts.some(part => part === '' || part === '.' || part === '..')) {
|
|
99
|
+
throw new ProvisionError('invalid-option', `模型文件路径不安全:${JSON.stringify(file)}`);
|
|
100
|
+
}
|
|
101
|
+
return join(root, ...parts);
|
|
102
|
+
}
|
|
103
|
+
function cacheDirName(repo) {
|
|
104
|
+
return `models--${repo.replaceAll('\\', '/').replaceAll('/', '--')}`;
|
|
105
|
+
}
|
|
106
|
+
function hubRoot(home, targetRoot, repo) {
|
|
107
|
+
return join(home, targetRoot, cacheDirName(repo));
|
|
108
|
+
}
|
|
109
|
+
function flatDataDir(home, targetRoot, repo) {
|
|
110
|
+
return join(home, targetRoot, ...repo.replaceAll('\\', '/').split('/'));
|
|
111
|
+
}
|
|
112
|
+
function flatSidecarDir(home, targetRoot, repo) {
|
|
113
|
+
return join(home, targetRoot, SIDECAR_DIR, cacheDirName(repo));
|
|
114
|
+
}
|
|
115
|
+
function sha256Hex(bytes) {
|
|
116
|
+
return createHash('sha256').update(bytes).digest('hex');
|
|
117
|
+
}
|
|
118
|
+
function text(value) {
|
|
119
|
+
return new TextDecoder().decode(value);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* The endpoints to try, in order: an explicit `spec.endpoint`, else `policy.mirrors.model`
|
|
123
|
+
* followed by the default endpoint. Trailing slashes are normalised away.
|
|
124
|
+
*/
|
|
125
|
+
function endpointsOf(spec, policy) {
|
|
126
|
+
const candidates = spec.endpoint === undefined ? [...(policy.mirrors?.model ?? []), DEFAULT_ENDPOINT] : [spec.endpoint];
|
|
127
|
+
const endpoints = [];
|
|
128
|
+
for (const candidate of candidates) {
|
|
129
|
+
const endpoint = candidate.trim().replace(/\/+$/, '');
|
|
130
|
+
if (endpoint !== '' && !endpoints.includes(endpoint))
|
|
131
|
+
endpoints.push(endpoint);
|
|
132
|
+
}
|
|
133
|
+
return endpoints.length === 0 ? [DEFAULT_ENDPOINT] : endpoints;
|
|
134
|
+
}
|
|
135
|
+
/** The files `verify` and the `flat` probe insist on; `config.json` is always required. */
|
|
136
|
+
function requiredFilesOf(spec) {
|
|
137
|
+
return [...new Set(['config.json', ...(spec.requiredFiles ?? [])])];
|
|
138
|
+
}
|
|
139
|
+
async function resolveRevision(ctx, spec) {
|
|
140
|
+
const revision = spec.revision ?? DEFAULT_REVISION;
|
|
141
|
+
// Only a full 40/64-hex commit sha short-circuits the lookup.
|
|
142
|
+
if (isSha(revision))
|
|
143
|
+
return revision;
|
|
144
|
+
const problems = [];
|
|
145
|
+
for (const endpoint of endpointsOf(spec, ctx.policy)) {
|
|
146
|
+
const url = `${endpoint}/api/models/${spec.repo}/revision/${revision}`;
|
|
147
|
+
try {
|
|
148
|
+
const response = await fetchImplOf(ctx)(url, { headers: { accept: 'application/json' }, signal: signalFor(ctx) });
|
|
149
|
+
if (!response.ok) {
|
|
150
|
+
problems.push(`${url} → HTTP ${String(response.status)}`);
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
const body = await response.json();
|
|
154
|
+
const sha = typeof body === 'object' && body !== null ? body.sha : undefined;
|
|
155
|
+
if (!isSha(sha)) {
|
|
156
|
+
problems.push(`${url} → 响应 sha 不是 40/64 位小写十六进制`);
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
return sha;
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
problems.push(`${url} → ${error instanceof Error ? error.message : String(error)}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
throw new ProvisionError('fetch/failed', `无法解析 ${spec.repo}@${revision}:${problems.join('; ')}`);
|
|
166
|
+
}
|
|
167
|
+
/** The explicitly declared file list; an explicit empty list is a spec error, not a remote query. */
|
|
168
|
+
function declaredFiles(spec) {
|
|
169
|
+
if (spec.files === undefined)
|
|
170
|
+
return undefined;
|
|
171
|
+
if (spec.files.length === 0)
|
|
172
|
+
throw new ProvisionError('invalid-option', `${spec.repo} 的 spec.files 为空`);
|
|
173
|
+
return spec.files;
|
|
174
|
+
}
|
|
175
|
+
async function listFiles(ctx, spec) {
|
|
176
|
+
const declared = declaredFiles(spec);
|
|
177
|
+
if (declared !== undefined)
|
|
178
|
+
return declared;
|
|
179
|
+
const problems = [];
|
|
180
|
+
for (const endpoint of endpointsOf(spec, ctx.policy)) {
|
|
181
|
+
const url = `${endpoint}/api/models/${spec.repo}`;
|
|
182
|
+
try {
|
|
183
|
+
const response = await fetchImplOf(ctx)(url, { headers: { accept: 'application/json' }, signal: signalFor(ctx) });
|
|
184
|
+
if (!response.ok) {
|
|
185
|
+
problems.push(`${url} → HTTP ${String(response.status)}`);
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
const body = await response.json();
|
|
189
|
+
const siblings = typeof body === 'object' && body !== null ? body.siblings : undefined;
|
|
190
|
+
const names = Array.isArray(siblings)
|
|
191
|
+
? siblings.map(row => (typeof row === 'object' && row !== null ? row.rfilename : undefined))
|
|
192
|
+
: [];
|
|
193
|
+
const files = names.filter((name) => typeof name === 'string' && name !== '');
|
|
194
|
+
if (files.length === 0) {
|
|
195
|
+
problems.push(`${url} → 文件列表为空`);
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
return files;
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
problems.push(`${url} → ${error instanceof Error ? error.message : String(error)}`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
throw new ProvisionError('fetch/failed', `无法列出 ${spec.repo} 的文件:${problems.join('; ')}`);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Download one file, trying each endpoint in order. A length or integrity failure is final: only
|
|
208
|
+
* transport-level failures fall through to the next mirror.
|
|
209
|
+
*/
|
|
210
|
+
async function downloadFile(ctx, endpoints, repo, sha, file) {
|
|
211
|
+
const problems = [];
|
|
212
|
+
for (const endpoint of endpoints) {
|
|
213
|
+
const url = `${endpoint}/${repo}/resolve/${sha}/${file}`;
|
|
214
|
+
try {
|
|
215
|
+
const response = await fetchImplOf(ctx)(url, { signal: signalFor(ctx) });
|
|
216
|
+
if (!response.ok) {
|
|
217
|
+
problems.push(`${url} → HTTP ${String(response.status)}`);
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
return await readCapped(response, MAX_MODEL_BYTES);
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
if (error instanceof ProvisionError)
|
|
224
|
+
throw error;
|
|
225
|
+
problems.push(`${url} → ${error instanceof Error ? error.message : String(error)}`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
throw new ProvisionError('fetch/failed', `下载 ${repo}/${file} 失败:${problems.join('; ')}`);
|
|
229
|
+
}
|
|
230
|
+
/** The cached snapshot directory for the declared revision, or `undefined` when not cached. */
|
|
231
|
+
async function findSnapshot(ctx, root, spec) {
|
|
232
|
+
const revision = spec.revision ?? DEFAULT_REVISION;
|
|
233
|
+
const refPath = join(root, 'refs', revision);
|
|
234
|
+
if (!(await exists(ctx.fs, refPath)))
|
|
235
|
+
return undefined;
|
|
236
|
+
const recorded = text(await ctx.fs.readFile(refPath)).trim();
|
|
237
|
+
// A ref must name a commit id; anything else is a corrupt or hostile marker.
|
|
238
|
+
if (!isSha(recorded))
|
|
239
|
+
return undefined;
|
|
240
|
+
// A sha-pinned revision resolves to exactly that sha; a branch resolves to whatever it records.
|
|
241
|
+
const pinned = isSha(revision) ? revision : undefined;
|
|
242
|
+
if (pinned !== undefined && recorded !== pinned)
|
|
243
|
+
return undefined;
|
|
244
|
+
const candidate = join(root, 'snapshots', recorded);
|
|
245
|
+
return (await exists(ctx.fs, candidate)) ? candidate : undefined;
|
|
246
|
+
}
|
|
247
|
+
function encodeRecord(record) {
|
|
248
|
+
return new TextEncoder().encode(`${JSON.stringify(record, null, 2)}\n`);
|
|
249
|
+
}
|
|
250
|
+
function decodeRecord(bytes) {
|
|
251
|
+
let parsed;
|
|
252
|
+
try {
|
|
253
|
+
parsed = JSON.parse(text(bytes));
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
return undefined;
|
|
257
|
+
}
|
|
258
|
+
if (typeof parsed !== 'object' || parsed === null)
|
|
259
|
+
return undefined;
|
|
260
|
+
const record = parsed;
|
|
261
|
+
if (record['schemaVersion'] !== RECORD_SCHEMA_VERSION)
|
|
262
|
+
return undefined;
|
|
263
|
+
if (typeof record['repo'] !== 'string' || typeof record['revision'] !== 'string' || !isSha(record['sha']))
|
|
264
|
+
return undefined;
|
|
265
|
+
const files = record['files'];
|
|
266
|
+
if (!Array.isArray(files) || files.some(file => typeof file !== 'string'))
|
|
267
|
+
return undefined;
|
|
268
|
+
// Digests are optional: a names-only record from an older build stays usable.
|
|
269
|
+
const rawDigests = record['digests'];
|
|
270
|
+
const digests = Object.create(null);
|
|
271
|
+
if (typeof rawDigests === 'object' && rawDigests !== null && !Array.isArray(rawDigests)) {
|
|
272
|
+
for (const [file, value] of Object.entries(rawDigests)) {
|
|
273
|
+
if (typeof value === 'string' && BLOB_PATTERN.test(value))
|
|
274
|
+
digests[file] = value;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return { schemaVersion: RECORD_SCHEMA_VERSION, repo: record['repo'], revision: record['revision'], sha: record['sha'], files, digests };
|
|
278
|
+
}
|
|
279
|
+
/** Run `work` under the core's placement lock. */
|
|
280
|
+
async function withLock(ctx, work) {
|
|
281
|
+
const lock = ctx.lock ?? defaultLock();
|
|
282
|
+
const handle = await lock.acquire(lockPath(ctx.home), { timeoutMs: LOCK_TIMEOUT_MS, staleMs: STALE_LOCK_MS });
|
|
283
|
+
try {
|
|
284
|
+
return await work();
|
|
285
|
+
}
|
|
286
|
+
finally {
|
|
287
|
+
handle.dispose();
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Make `destination` resolve to `blob`: keep an existing link that already resolves to the blob,
|
|
292
|
+
* else place a fresh temp symlink and rename it over the destination. When links are unsupported,
|
|
293
|
+
* atomically write the blob's bytes. A destination that is a directory is cleared first.
|
|
294
|
+
*/
|
|
295
|
+
async function linkOrWrite(fs, blob, destination) {
|
|
296
|
+
const parent = dirname(destination);
|
|
297
|
+
const expected = relative(parent, blob);
|
|
298
|
+
const current = await fs.readlink(destination);
|
|
299
|
+
if (current !== undefined && resolve(parent, current) === resolve(blob))
|
|
300
|
+
return;
|
|
301
|
+
await fs.mkdir(parent);
|
|
302
|
+
const info = await fs.stat(destination);
|
|
303
|
+
if (info?.isDirectory === true)
|
|
304
|
+
await fs.rm(destination, { recursive: true });
|
|
305
|
+
// A temp name is retried once before falling back, so a stray temp never becomes a copy.
|
|
306
|
+
for (let attempt = 0; attempt < 2; attempt += 1) {
|
|
307
|
+
const temp = join(parent, `${ATOMIC_TEMP_PREFIX}link-${String(process.pid)}-${String((linkSequence += 1))}`);
|
|
308
|
+
await fs.rm(temp).catch(() => undefined);
|
|
309
|
+
try {
|
|
310
|
+
await fs.symlink(expected, temp);
|
|
311
|
+
await fs.rename(temp, destination);
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
catch {
|
|
315
|
+
await fs.rm(temp).catch(() => undefined);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
await fs.atomicWrite(destination, await fs.readFile(blob));
|
|
319
|
+
}
|
|
320
|
+
/** Write `bytes` to a content-addressed `blob`, repairing a missing, directory or wrong-sized blob. */
|
|
321
|
+
async function writeBlob(fs, blob, bytes) {
|
|
322
|
+
const info = await fs.stat(blob);
|
|
323
|
+
if (info?.isDirectory === true)
|
|
324
|
+
await fs.rm(blob, { recursive: true });
|
|
325
|
+
else if (info !== undefined && info.size === bytes.byteLength)
|
|
326
|
+
return;
|
|
327
|
+
await fs.atomicWrite(blob, bytes);
|
|
328
|
+
}
|
|
329
|
+
/** Throw a `verify/failed` for the first file that is not provably usable. */
|
|
330
|
+
function verifyFailure(message) {
|
|
331
|
+
throw new ProvisionError('verify/failed', message);
|
|
332
|
+
}
|
|
333
|
+
/** Probe the `flat` layout from the sidecar alone: no network, no mutation. */
|
|
334
|
+
async function probeFlat(ctx, item, spec) {
|
|
335
|
+
const dataDir = flatDataDir(ctx.home, item.target.root, spec.repo);
|
|
336
|
+
const recordPath = join(flatSidecarDir(ctx.home, item.target.root, spec.repo), RECORD_FILE);
|
|
337
|
+
try {
|
|
338
|
+
if (!(await exists(ctx.fs, recordPath)))
|
|
339
|
+
return { found: false };
|
|
340
|
+
const record = decodeRecord(await ctx.fs.readFile(recordPath));
|
|
341
|
+
if (record === undefined || record.repo !== spec.repo)
|
|
342
|
+
return { found: false };
|
|
343
|
+
const revision = spec.revision ?? DEFAULT_REVISION;
|
|
344
|
+
const pinned = isSha(revision) ? revision : undefined;
|
|
345
|
+
if (pinned === undefined ? record.revision !== revision : record.sha !== pinned)
|
|
346
|
+
return { found: false };
|
|
347
|
+
for (const file of [...new Set([...record.files, ...requiredFilesOf(spec)])]) {
|
|
348
|
+
const path = fileUnder(dataDir, file);
|
|
349
|
+
const info = await ctx.fs.stat(path);
|
|
350
|
+
if (info === undefined || info.isDirectory || info.size === 0)
|
|
351
|
+
return { found: false };
|
|
352
|
+
const expected = record.digests[file];
|
|
353
|
+
// A link must name the recorded digest; a real file is proven by `verify` instead.
|
|
354
|
+
if (expected !== undefined) {
|
|
355
|
+
const link = await ctx.fs.readlink(path);
|
|
356
|
+
if (link !== undefined && basename(resolve(dirname(path), link)) !== expected)
|
|
357
|
+
return { found: false };
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
return { found: true, version: record.sha, dir: dataDir, source: 'managed' };
|
|
361
|
+
}
|
|
362
|
+
catch {
|
|
363
|
+
// A malformed record or an unsafe path is a miss, not a crash.
|
|
364
|
+
return { found: false };
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
/** Prove every required snapshot entry is its content-addressed blob, without touching the network. */
|
|
368
|
+
async function verifyHub(ctx, item, spec, resolved) {
|
|
369
|
+
const blobs = join(hubRoot(ctx.home, item.target.root, spec.repo), 'blobs');
|
|
370
|
+
for (const file of requiredFilesOf(spec)) {
|
|
371
|
+
const path = fileUnder(resolved.entryDir, file);
|
|
372
|
+
const info = await ctx.fs.stat(path);
|
|
373
|
+
if (info === undefined)
|
|
374
|
+
verifyFailure(`模型文件缺失 ${file}:${resolved.entryDir}`);
|
|
375
|
+
if (info.isDirectory)
|
|
376
|
+
verifyFailure(`模型文件是目录 ${file}:${path}`);
|
|
377
|
+
if (info.size === 0)
|
|
378
|
+
verifyFailure(`模型文件为空 ${file}:${path}`);
|
|
379
|
+
const digest = sha256Hex(await ctx.fs.readFile(path));
|
|
380
|
+
const link = await ctx.fs.readlink(path);
|
|
381
|
+
if (link !== undefined) {
|
|
382
|
+
// The entry resolves into blobs, so the read above already proved the blob's bytes.
|
|
383
|
+
const target = resolve(dirname(path), link);
|
|
384
|
+
if (!isInside(blobs, target))
|
|
385
|
+
verifyFailure(`模型文件的链接指向 blobs 之外:${path}`);
|
|
386
|
+
const named = basename(target);
|
|
387
|
+
if (!BLOB_PATTERN.test(named))
|
|
388
|
+
verifyFailure(`模型文件的链接目标名不是 sha256:${path}`);
|
|
389
|
+
if (digest !== named)
|
|
390
|
+
verifyFailure(`模型文件内容与 blob 名不符 ${file}:${path}`);
|
|
391
|
+
continue;
|
|
392
|
+
}
|
|
393
|
+
// A real-file fallback carries no expectation; the blob named by its digest must exist intact.
|
|
394
|
+
const blobPath = join(blobs, digest);
|
|
395
|
+
const blobInfo = await ctx.fs.stat(blobPath);
|
|
396
|
+
if (blobInfo === undefined || blobInfo.isDirectory || blobInfo.size === 0)
|
|
397
|
+
verifyFailure(`blob 缺失或为空:${blobPath}`);
|
|
398
|
+
if (sha256Hex(await ctx.fs.readFile(blobPath)) !== digest)
|
|
399
|
+
verifyFailure(`blob 内容与名字不符:${blobPath}`);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
/** Prove every required `flat` entry matches its recorded digest or the blob its link names. */
|
|
403
|
+
async function verifyFlat(ctx, item, spec) {
|
|
404
|
+
const dataDir = flatDataDir(ctx.home, item.target.root, spec.repo);
|
|
405
|
+
const blobs = join(flatSidecarDir(ctx.home, item.target.root, spec.repo), 'blobs');
|
|
406
|
+
let record;
|
|
407
|
+
try {
|
|
408
|
+
record = decodeRecord(await ctx.fs.readFile(join(flatSidecarDir(ctx.home, item.target.root, spec.repo), RECORD_FILE)));
|
|
409
|
+
}
|
|
410
|
+
catch {
|
|
411
|
+
record = undefined;
|
|
412
|
+
}
|
|
413
|
+
const digests = record?.digests ?? {};
|
|
414
|
+
for (const file of requiredFilesOf(spec)) {
|
|
415
|
+
const path = fileUnder(dataDir, file);
|
|
416
|
+
const info = await ctx.fs.stat(path);
|
|
417
|
+
if (info === undefined)
|
|
418
|
+
verifyFailure(`模型文件缺失 ${file}:${dataDir}`);
|
|
419
|
+
if (info.isDirectory)
|
|
420
|
+
verifyFailure(`模型文件是目录 ${file}:${path}`);
|
|
421
|
+
if (info.size === 0)
|
|
422
|
+
verifyFailure(`模型文件为空 ${file}:${path}`);
|
|
423
|
+
const digest = sha256Hex(await ctx.fs.readFile(path));
|
|
424
|
+
const link = await ctx.fs.readlink(path);
|
|
425
|
+
if (link !== undefined) {
|
|
426
|
+
// The entry resolves into the sidecar, so the read above already proved the blob's bytes.
|
|
427
|
+
const target = resolve(dirname(path), link);
|
|
428
|
+
if (!isInside(blobs, target))
|
|
429
|
+
verifyFailure(`模型文件的链接指向 blobs 之外:${path}`);
|
|
430
|
+
const named = basename(target);
|
|
431
|
+
if (!BLOB_PATTERN.test(named))
|
|
432
|
+
verifyFailure(`模型文件的链接目标名不是 sha256:${path}`);
|
|
433
|
+
if (digest !== named)
|
|
434
|
+
verifyFailure(`模型文件内容与 blob 名不符 ${file}:${path}`);
|
|
435
|
+
}
|
|
436
|
+
// A names-only record cannot prove content; a recorded digest always can.
|
|
437
|
+
const expected = digests[file];
|
|
438
|
+
if (expected !== undefined && digest !== expected)
|
|
439
|
+
verifyFailure(`模型文件内容与 record.json 不符 ${file}:${path}`);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
/** Build the built-in model-cache provider. */
|
|
443
|
+
export function modelCacheProvider(options = {}) {
|
|
444
|
+
const id = options.id ?? '@avantf/dsh-plugin-base/model-cache';
|
|
445
|
+
return {
|
|
446
|
+
id,
|
|
447
|
+
kinds: [MODEL_CACHE_KIND],
|
|
448
|
+
identify(item) {
|
|
449
|
+
const spec = parseSpec(item);
|
|
450
|
+
return { name: spec.repo, range: spec.revision ?? DEFAULT_REVISION };
|
|
451
|
+
},
|
|
452
|
+
targetDir(_item, ref) {
|
|
453
|
+
return `${cacheDirName(ref.name)}/${ref.segment}`;
|
|
454
|
+
},
|
|
455
|
+
plan() {
|
|
456
|
+
return { action: 'install' };
|
|
457
|
+
},
|
|
458
|
+
async probe(item, ctx) {
|
|
459
|
+
const spec = parseSpec(item);
|
|
460
|
+
const layout = layoutOf(spec);
|
|
461
|
+
if (layout === FLAT_LAYOUT)
|
|
462
|
+
return probeFlat(ctx, item, spec);
|
|
463
|
+
const root = hubRoot(ctx.home, item.target.root, spec.repo);
|
|
464
|
+
const snapshot = await findSnapshot(ctx, root, spec);
|
|
465
|
+
if (snapshot === undefined)
|
|
466
|
+
return { found: false };
|
|
467
|
+
for (const file of requiredFilesOf(spec)) {
|
|
468
|
+
const info = await ctx.fs.stat(fileUnder(snapshot, file));
|
|
469
|
+
if (info === undefined || info.isDirectory || info.size === 0)
|
|
470
|
+
return { found: false };
|
|
471
|
+
}
|
|
472
|
+
const version = snapshot.split(/[\\/]/).pop();
|
|
473
|
+
return { found: true, ...(version === undefined ? {} : { version }), dir: snapshot, source: 'managed' };
|
|
474
|
+
},
|
|
475
|
+
async install(item, ctx) {
|
|
476
|
+
const spec = parseSpec(item);
|
|
477
|
+
assertEndpoint(spec);
|
|
478
|
+
const layout = layoutOf(spec);
|
|
479
|
+
const endpoints = endpointsOf(spec, ctx.policy);
|
|
480
|
+
// A declared list is validated before any network use, so an empty one fails as `invalid-option`.
|
|
481
|
+
const declared = declaredFiles(spec);
|
|
482
|
+
const sha = await resolveRevision(ctx, spec);
|
|
483
|
+
const files = [...new Set(declared ?? (await listFiles(ctx, spec)))];
|
|
484
|
+
const revision = spec.revision ?? DEFAULT_REVISION;
|
|
485
|
+
if (layout === FLAT_LAYOUT) {
|
|
486
|
+
const dataDir = flatDataDir(ctx.home, item.target.root, spec.repo);
|
|
487
|
+
const sidecar = flatSidecarDir(ctx.home, item.target.root, spec.repo);
|
|
488
|
+
const blobs = join(sidecar, 'blobs');
|
|
489
|
+
await ctx.fs.mkdir(blobs);
|
|
490
|
+
const placements = [];
|
|
491
|
+
for (const file of files) {
|
|
492
|
+
const bytes = await downloadFile(ctx, endpoints, spec.repo, sha, file);
|
|
493
|
+
ctx.onProgress?.({ key: `${MODEL_CACHE_KIND}+${spec.repo}`, phase: 'download', loaded: bytes.byteLength, total: bytes.byteLength });
|
|
494
|
+
const digest = sha256Hex(bytes);
|
|
495
|
+
const blob = join(blobs, digest);
|
|
496
|
+
// Content-addressed blobs are written atomically.
|
|
497
|
+
await writeBlob(ctx.fs, blob, bytes);
|
|
498
|
+
placements.push({ file, blob, digest });
|
|
499
|
+
}
|
|
500
|
+
// Placement and the completion marker are one critical section.
|
|
501
|
+
await withLock(ctx, async () => {
|
|
502
|
+
for (const placement of placements)
|
|
503
|
+
await linkOrWrite(ctx.fs, placement.blob, fileUnder(dataDir, placement.file));
|
|
504
|
+
await sweepAtomicTemps(ctx.fs, sidecar);
|
|
505
|
+
await ctx.fs.atomicWrite(join(sidecar, RECORD_FILE), encodeRecord({
|
|
506
|
+
schemaVersion: RECORD_SCHEMA_VERSION,
|
|
507
|
+
repo: spec.repo,
|
|
508
|
+
revision,
|
|
509
|
+
sha,
|
|
510
|
+
files,
|
|
511
|
+
digests: Object.fromEntries(placements.map(placement => [placement.file, placement.digest])),
|
|
512
|
+
}));
|
|
513
|
+
});
|
|
514
|
+
return { name: spec.repo, version: sha, dir: dataDir, entryDir: dataDir, source: 'installed' };
|
|
515
|
+
}
|
|
516
|
+
const root = hubRoot(ctx.home, item.target.root, spec.repo);
|
|
517
|
+
const snapshot = join(root, 'snapshots', sha);
|
|
518
|
+
const blobs = join(root, 'blobs');
|
|
519
|
+
await ctx.fs.mkdir(blobs);
|
|
520
|
+
await ctx.fs.mkdir(snapshot);
|
|
521
|
+
const placements = [];
|
|
522
|
+
for (const file of files) {
|
|
523
|
+
const bytes = await downloadFile(ctx, endpoints, spec.repo, sha, file);
|
|
524
|
+
ctx.onProgress?.({ key: `${MODEL_CACHE_KIND}+${spec.repo}`, phase: 'download', loaded: bytes.byteLength, total: bytes.byteLength });
|
|
525
|
+
const digest = sha256Hex(bytes);
|
|
526
|
+
const blob = join(blobs, digest);
|
|
527
|
+
// Content-addressed blobs are written atomically.
|
|
528
|
+
await writeBlob(ctx.fs, blob, bytes);
|
|
529
|
+
placements.push({ file, blob, digest });
|
|
530
|
+
}
|
|
531
|
+
// Snapshot links and the ref marker are one critical section.
|
|
532
|
+
await withLock(ctx, async () => {
|
|
533
|
+
for (const placement of placements)
|
|
534
|
+
await linkOrWrite(ctx.fs, placement.blob, fileUnder(snapshot, placement.file));
|
|
535
|
+
await sweepAtomicTemps(ctx.fs, join(root, 'refs'));
|
|
536
|
+
await ctx.fs.mkdir(join(root, 'refs'));
|
|
537
|
+
await ctx.fs.atomicWrite(join(root, 'refs', revision), new TextEncoder().encode(sha));
|
|
538
|
+
});
|
|
539
|
+
// This kind bypasses `publish()`: no `install.json`, and `dir` is this snapshot.
|
|
540
|
+
return { name: spec.repo, version: sha, dir: snapshot, entryDir: snapshot, source: 'installed' };
|
|
541
|
+
},
|
|
542
|
+
async verify(item, resolved, ctx) {
|
|
543
|
+
const spec = parseSpec(item);
|
|
544
|
+
if (layoutOf(spec) === FLAT_LAYOUT)
|
|
545
|
+
return verifyFlat(ctx, item, spec);
|
|
546
|
+
return verifyHub(ctx, item, spec, resolved);
|
|
547
|
+
},
|
|
548
|
+
};
|
|
549
|
+
}
|
|
550
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/providers/model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Provider } from '../types.js';
|
|
2
|
+
export declare const NPM_PACKAGE_KIND = "npm-package";
|
|
3
|
+
/** The `spec` of an `npm-package` item. */
|
|
4
|
+
export interface NpmPackageSpec {
|
|
5
|
+
readonly name: string;
|
|
6
|
+
readonly range: string;
|
|
7
|
+
readonly registry?: string;
|
|
8
|
+
/** Expected integrity for private mirrors; overrides `dist.integrity`. */
|
|
9
|
+
readonly expectedIntegrity?: string;
|
|
10
|
+
/** Extra peers the caller wants linked, with an explicit resolved directory when it has one. */
|
|
11
|
+
readonly peers?: readonly {
|
|
12
|
+
readonly name: string;
|
|
13
|
+
readonly optional?: boolean;
|
|
14
|
+
readonly dir?: string;
|
|
15
|
+
}[];
|
|
16
|
+
}
|
|
17
|
+
/** Build the built-in npm provider. */
|
|
18
|
+
export declare function npmPackageProvider(options?: {
|
|
19
|
+
readonly id?: string;
|
|
20
|
+
}): Provider;
|
|
21
|
+
//# sourceMappingURL=npm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm.d.ts","sourceRoot":"","sources":["../../src/providers/npm.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAA+B,QAAQ,EAAuE,MAAM,aAAa,CAAA;AAE7I,eAAO,MAAM,gBAAgB,gBAAgB,CAAA;AAM7C,2CAA2C;AAC3C,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,0EAA0E;IAC1E,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IACnC,gGAAgG;IAChG,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAC1G;AAyRD,uCAAuC;AACvC,wBAAgB,kBAAkB,CAAC,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,QAAQ,CA4JnF"}
|