@ccdd/project 3.3.1 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -12
- package/dist/monitor-ui/assets/GraphView-CaxsIXtN.js +27 -0
- package/dist/monitor-ui/assets/ValidationView-BMqI2XQ5.css +1 -0
- package/dist/monitor-ui/assets/ValidationView-CGW6-Ljw.js +1 -0
- package/dist/monitor-ui/assets/{elk-api-D5d3gWoP.js → elk-api-DIQ2_nge.js} +1 -1
- package/dist/monitor-ui/assets/{elk.bundled-0eaKiuBP.js → elk.bundled-BRtnLd_M.js} +1 -1
- package/dist/monitor-ui/assets/{index-DDwx11D7.css → index-D0yfhUlt.css} +1 -1
- package/dist/monitor-ui/assets/index-LyUbXn5P.js +7 -0
- package/dist/monitor-ui/index.html +2 -2
- package/dist/scripts/prepare-demo.js +25 -44
- package/dist/scripts/prepare-demo.js.map +1 -1
- package/dist/src/artifact-scope.d.ts +6 -0
- package/dist/src/artifact-scope.js +27 -0
- package/dist/src/artifact-scope.js.map +1 -0
- package/dist/src/artifacts/index.d.ts +7 -155
- package/dist/src/artifacts/index.js +0 -354
- package/dist/src/artifacts/index.js.map +1 -1
- package/dist/src/artifacts/instruction.d.ts +6 -9
- package/dist/src/artifacts/instruction.js +28 -36
- package/dist/src/artifacts/instruction.js.map +1 -1
- package/dist/src/artifacts/mcp-server.js +5 -6
- package/dist/src/artifacts/mcp-server.js.map +1 -1
- package/dist/src/artifacts/scope.d.ts +12 -0
- package/dist/src/artifacts/scope.js +34 -0
- package/dist/src/artifacts/scope.js.map +1 -0
- package/dist/src/artifacts/tool-check.d.ts +2 -6
- package/dist/src/artifacts/tool-check.js +14 -18
- package/dist/src/artifacts/tool-check.js.map +1 -1
- package/dist/src/artifacts/types.d.ts +3 -37
- package/dist/src/artifacts/types.js +5 -89
- package/dist/src/artifacts/types.js.map +1 -1
- package/dist/src/broker/config.d.ts +5 -6
- package/dist/src/broker/config.js +183 -130
- package/dist/src/broker/config.js.map +1 -1
- package/dist/src/broker/graph.d.ts +14 -21
- package/dist/src/broker/graph.js +68 -70
- package/dist/src/broker/graph.js.map +1 -1
- package/dist/src/broker/index.d.ts +6 -28
- package/dist/src/broker/index.js +35 -221
- package/dist/src/broker/index.js.map +1 -1
- package/dist/src/cli.d.ts +1 -21
- package/dist/src/cli.js +2 -329
- package/dist/src/cli.js.map +1 -1
- package/dist/src/contracts.d.ts +12 -15
- package/dist/src/definitions.d.ts +33 -23
- package/dist/src/diagnostics-cli.d.ts +9 -0
- package/dist/src/diagnostics-cli.js +94 -0
- package/dist/src/diagnostics-cli.js.map +1 -0
- package/dist/src/doctor/index.d.ts +2 -4
- package/dist/src/doctor/index.js +17 -63
- package/dist/src/doctor/index.js.map +1 -1
- package/dist/src/executors/auth.d.ts +1 -1
- package/dist/src/executors/auth.js +2 -2
- package/dist/src/executors/auth.js.map +1 -1
- package/dist/src/executors/human-preparation.js +2 -10
- package/dist/src/executors/human-preparation.js.map +1 -1
- package/dist/src/executors/index.js +30 -29
- package/dist/src/executors/index.js.map +1 -1
- package/dist/src/executors/pi.js +2 -3
- package/dist/src/executors/pi.js.map +1 -1
- package/dist/src/executors/process.js +9 -0
- package/dist/src/executors/process.js.map +1 -1
- package/dist/src/monitor/actions.js +3 -3
- package/dist/src/monitor/actions.js.map +1 -1
- package/dist/src/monitor/server.js +12 -95
- package/dist/src/monitor/server.js.map +1 -1
- package/dist/src/monitor/store.js +6 -42
- package/dist/src/monitor/store.js.map +1 -1
- package/dist/src/monitor/types.d.ts +3 -13
- package/dist/src/monitor/ui/critic-presentation.js +1 -1
- package/dist/src/monitor/ui/critic-presentation.js.map +1 -1
- package/dist/src/monitor/ui/graph-layout.d.ts +0 -1
- package/dist/src/monitor/ui/graph-layout.js +1 -23
- package/dist/src/monitor/ui/graph-layout.js.map +1 -1
- package/dist/src/monitor/ui/tool-input.d.ts +1 -1
- package/dist/src/monitor/ui/tool-input.js +2 -3
- package/dist/src/monitor/ui/tool-input.js.map +1 -1
- package/dist/src/project/cli.js +18 -30
- package/dist/src/project/cli.js.map +1 -1
- package/dist/src/project/graph.js +2 -2
- package/dist/src/project/graph.js.map +1 -1
- package/dist/src/project/identity.js +83 -56
- package/dist/src/project/identity.js.map +1 -1
- package/dist/src/project/index.d.ts +0 -3
- package/dist/src/project/index.js +2 -6
- package/dist/src/project/index.js.map +1 -1
- package/dist/src/project/query.d.ts +2 -1
- package/dist/src/project/query.js +49 -74
- package/dist/src/project/query.js.map +1 -1
- package/dist/src/project/store.js +2 -2
- package/dist/src/project/store.js.map +1 -1
- package/dist/src/project/types.d.ts +4 -4
- package/dist/src/requester/index.d.ts +2 -9
- package/dist/src/requester/index.js +17 -96
- package/dist/src/requester/index.js.map +1 -1
- package/dist/src/sdk.d.ts +3 -8
- package/dist/src/sdk.js +2 -3
- package/dist/src/sdk.js.map +1 -1
- package/dist/src/tools/contracts.d.ts +34 -78
- package/dist/src/tools/diagnostics.js +1 -2
- package/dist/src/tools/diagnostics.js.map +1 -1
- package/dist/src/tools/environment.d.ts +1 -0
- package/dist/src/tools/environment.js +7 -11
- package/dist/src/tools/environment.js.map +1 -1
- package/dist/src/tools/manifest.d.ts +0 -1
- package/dist/src/tools/manifest.js +1 -25
- package/dist/src/tools/manifest.js.map +1 -1
- package/dist/src/tools/runner.d.ts +10 -14
- package/dist/src/tools/runner.js +144 -118
- package/dist/src/tools/runner.js.map +1 -1
- package/dist/src/tools/schema.js +1 -1
- package/dist/src/tools/schema.js.map +1 -1
- package/dist/src/workspaces/index.d.ts +5 -12
- package/dist/src/workspaces/index.js +33 -217
- package/dist/src/workspaces/index.js.map +1 -1
- package/package.json +38 -10
- package/dist/monitor-ui/assets/GraphView-BSZlEAs3.js +0 -27
- package/dist/monitor-ui/assets/ValidationView-DaEF78J-.js +0 -1
- package/dist/monitor-ui/assets/ValidationView-p5r8lX18.css +0 -1
- package/dist/monitor-ui/assets/index-BQlWbkpH.js +0 -8
- package/dist/src/artifacts/data.d.ts +0 -5
- package/dist/src/artifacts/data.js +0 -100
- package/dist/src/artifacts/data.js.map +0 -1
- package/dist/src/artifacts/groups.d.ts +0 -13
- package/dist/src/artifacts/groups.js +0 -93
- package/dist/src/artifacts/groups.js.map +0 -1
- package/dist/src/artifacts/human.d.ts +0 -38
- package/dist/src/artifacts/human.js +0 -156
- package/dist/src/artifacts/human.js.map +0 -1
- package/dist/src/artifacts/sources.d.ts +0 -11
- package/dist/src/artifacts/sources.js +0 -106
- package/dist/src/artifacts/sources.js.map +0 -1
- package/dist/src/review/cli.d.ts +0 -8
- package/dist/src/review/cli.js +0 -136
- package/dist/src/review/cli.js.map +0 -1
- package/dist/src/review/client.d.ts +0 -30
- package/dist/src/review/client.js +0 -193
- package/dist/src/review/client.js.map +0 -1
- package/dist/src/review/server.d.ts +0 -11
- package/dist/src/review/server.js +0 -249
- package/dist/src/review/server.js.map +0 -1
- package/dist/src/review/types.d.ts +0 -10
- package/dist/src/review/types.js +0 -17
- package/dist/src/review/types.js.map +0 -1
- package/dist/src/tools/host.d.ts +0 -7
- package/dist/src/tools/host.js +0 -98
- package/dist/src/tools/host.js.map +0 -1
- package/dist/src/tools/runtime-host.d.ts +0 -1
- package/dist/src/tools/runtime-host.js +0 -212
- package/dist/src/tools/runtime-host.js.map +0 -1
- package/dist/src/workspaces/transfer.d.ts +0 -52
- package/dist/src/workspaces/transfer.js +0 -372
- package/dist/src/workspaces/transfer.js.map +0 -1
|
@@ -1,372 +0,0 @@
|
|
|
1
|
-
import { createHash, randomUUID } from 'node:crypto';
|
|
2
|
-
import { constants } from 'node:fs';
|
|
3
|
-
import { chmod, lstat, mkdir, open, realpath, rename, symlink, unlink } from 'node:fs/promises';
|
|
4
|
-
import path from 'node:path';
|
|
5
|
-
import { Readable, Transform } from 'node:stream';
|
|
6
|
-
import { pipeline } from 'node:stream/promises';
|
|
7
|
-
import { acquireWorkspacePublication, inspectWorkspace, removeOwnedWorkspaceTree, reopenWorkspace, } from './index.js';
|
|
8
|
-
const validatedManifests = new WeakMap();
|
|
9
|
-
const HASH = /^[a-f0-9]{64}$/;
|
|
10
|
-
const failure = (message) => Object.assign(new Error(message), { code: 'WORKSPACE_TRANSFER_INVALID' });
|
|
11
|
-
const errorCode = (error) => error && typeof error === 'object' && 'code' in error ? error.code : undefined;
|
|
12
|
-
const digest = (value) => createHash('sha256').update(value).digest('hex');
|
|
13
|
-
const record = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
14
|
-
const exactKeys = (value, keys) => Object.keys(value).sort().join(',') === keys.sort().join(',');
|
|
15
|
-
const executable = (value) => Number.isInteger(value) && Number(value) >= 0 && (Number(value) & ~0o111) === 0 && Number(value) <= 0o111;
|
|
16
|
-
// POSIX permits literal colons and backslashes. Windows interprets them as streams,
|
|
17
|
-
// drives or separators, so those names cannot be safely materialized on Windows.
|
|
18
|
-
const supportedPathText = (value) => !value.includes('\0') &&
|
|
19
|
-
(process.platform !== 'win32' || (!value.includes('\\') && !value.includes(':')));
|
|
20
|
-
const safePath = (value) => typeof value === 'string' && value.length > 0 &&
|
|
21
|
-
supportedPathText(value) &&
|
|
22
|
-
value.split('/').every(component => component !== '' && component !== '.' && component !== '..');
|
|
23
|
-
// Snapshot traversal sorts names within each directory, then visits children before siblings.
|
|
24
|
-
function compareEntries(left, right) {
|
|
25
|
-
const a = left.path.split('/');
|
|
26
|
-
const b = right.path.split('/');
|
|
27
|
-
for (let i = 0; i < Math.min(a.length, b.length); i++) {
|
|
28
|
-
if (a[i] !== b[i])
|
|
29
|
-
return a[i] < b[i] ? -1 : 1;
|
|
30
|
-
}
|
|
31
|
-
return a.length - b.length;
|
|
32
|
-
}
|
|
33
|
-
/** Validate untrusted transfer metadata before creating directories or requesting any bytes. */
|
|
34
|
-
export function validateWorkspaceManifest(value) {
|
|
35
|
-
if (record(value) && validatedManifests.has(value))
|
|
36
|
-
return value;
|
|
37
|
-
if (!record(value) || !exactKeys(value, ['version', 'hash', 'entries']) || value.version !== 1 ||
|
|
38
|
-
typeof value.hash !== 'string' || !HASH.test(value.hash) || !Array.isArray(value.entries)) {
|
|
39
|
-
throw failure('Invalid workspace transfer manifest.');
|
|
40
|
-
}
|
|
41
|
-
const entries = [];
|
|
42
|
-
const byPath = new Map();
|
|
43
|
-
const sizes = new Map();
|
|
44
|
-
const blobs = new Map();
|
|
45
|
-
for (const item of value.entries) {
|
|
46
|
-
if (!record(item) || !safePath(item.path) || byPath.has(item.path))
|
|
47
|
-
throw failure('Invalid or duplicate workspace entry path.');
|
|
48
|
-
let entry;
|
|
49
|
-
if (item.type === 'directory' && exactKeys(item, ['path', 'type', 'executable']) && executable(item.executable)) {
|
|
50
|
-
entry = { path: item.path, type: 'directory', executable: item.executable };
|
|
51
|
-
}
|
|
52
|
-
else if (item.type === 'file' && exactKeys(item, ['path', 'type', 'executable', 'content', 'size']) && executable(item.executable) &&
|
|
53
|
-
typeof item.content === 'string' && HASH.test(item.content) && typeof item.size === 'number' && Number.isSafeInteger(item.size) && item.size >= 0) {
|
|
54
|
-
if (sizes.has(item.content) && sizes.get(item.content) !== item.size)
|
|
55
|
-
throw failure('Conflicting sizes for one workspace blob.');
|
|
56
|
-
sizes.set(item.content, item.size);
|
|
57
|
-
entry = { path: item.path, type: 'file', executable: item.executable, content: item.content, size: item.size };
|
|
58
|
-
if (!blobs.has(entry.content))
|
|
59
|
-
blobs.set(entry.content, entry);
|
|
60
|
-
}
|
|
61
|
-
else if (item.type === 'symlink' && exactKeys(item, ['path', 'type', 'target']) && typeof item.target === 'string' &&
|
|
62
|
-
item.target.length > 0 && supportedPathText(item.target) && !path.isAbsolute(item.target)) {
|
|
63
|
-
entry = { path: item.path, type: 'symlink', target: item.target };
|
|
64
|
-
}
|
|
65
|
-
else
|
|
66
|
-
throw failure(`Invalid workspace entry: ${item.path}`);
|
|
67
|
-
const parent = path.posix.dirname(entry.path);
|
|
68
|
-
if (parent !== '.' && byPath.get(parent)?.type !== 'directory')
|
|
69
|
-
throw failure(`Workspace entry has no preceding directory parent: ${entry.path}`);
|
|
70
|
-
if (entries.length && compareEntries(entries[entries.length - 1], entry) >= 0)
|
|
71
|
-
throw failure('Workspace entries must use canonical snapshot order.');
|
|
72
|
-
entries.push(Object.freeze(entry));
|
|
73
|
-
byPath.set(entry.path, entry);
|
|
74
|
-
}
|
|
75
|
-
// Resolve link components in filesystem order: a link followed by '..' must not bypass checks.
|
|
76
|
-
for (const entry of entries) {
|
|
77
|
-
if (entry.type !== 'symlink')
|
|
78
|
-
continue;
|
|
79
|
-
const remaining = entry.path.split('/');
|
|
80
|
-
const resolved = [];
|
|
81
|
-
let links = 0;
|
|
82
|
-
while (remaining.length) {
|
|
83
|
-
const component = remaining.shift();
|
|
84
|
-
if (component === '' || component === '.')
|
|
85
|
-
continue;
|
|
86
|
-
if (component === '..') {
|
|
87
|
-
if (!resolved.length)
|
|
88
|
-
throw failure(`Workspace symlink escapes the snapshot: ${entry.path}`);
|
|
89
|
-
resolved.pop();
|
|
90
|
-
continue;
|
|
91
|
-
}
|
|
92
|
-
const target = byPath.get([...resolved, component].join('/'));
|
|
93
|
-
if (!target)
|
|
94
|
-
throw failure(`Workspace symlink is dangling: ${entry.path}`);
|
|
95
|
-
if (target.type === 'symlink') {
|
|
96
|
-
if (++links > 40)
|
|
97
|
-
throw failure(`Workspace symlink cycle or excessive depth: ${entry.path}`);
|
|
98
|
-
remaining.unshift(...target.target.split('/'));
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
if (remaining.length && target.type !== 'directory')
|
|
102
|
-
throw failure(`Workspace symlink traverses a file: ${entry.path}`);
|
|
103
|
-
resolved.push(component);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
const identity = entries.map(entry => entry.type === 'file'
|
|
108
|
-
? { path: entry.path, type: entry.type, executable: entry.executable, content: entry.content } : entry);
|
|
109
|
-
if (digest(JSON.stringify(identity)) !== value.hash)
|
|
110
|
-
throw failure('Workspace manifest does not match its snapshot hash.');
|
|
111
|
-
Object.freeze(entries);
|
|
112
|
-
const manifest = Object.freeze({ version: 1, hash: value.hash, entries });
|
|
113
|
-
validatedManifests.set(manifest, blobs);
|
|
114
|
-
return manifest;
|
|
115
|
-
}
|
|
116
|
-
export async function createWorkspaceManifest(descriptor, { signal } = {}) {
|
|
117
|
-
if (descriptor.mode !== 'copy')
|
|
118
|
-
throw failure('Only immutable copy workspaces can be transferred.');
|
|
119
|
-
const handle = await reopenWorkspace(descriptor, { signal });
|
|
120
|
-
try {
|
|
121
|
-
const inspected = await inspectWorkspace(descriptor.path, { signal: handle.signal, requireReadonly: true });
|
|
122
|
-
const entries = [];
|
|
123
|
-
for (const entry of inspected.entries) {
|
|
124
|
-
handle.signal.throwIfAborted();
|
|
125
|
-
if (entry.type === 'file') {
|
|
126
|
-
const info = await lstat(path.join(descriptor.path, entry.path));
|
|
127
|
-
if (!info.isFile() || !entry.content)
|
|
128
|
-
throw failure('Workspace file changed while preparing its manifest.');
|
|
129
|
-
entries.push({ ...entry, content: entry.content, size: info.size });
|
|
130
|
-
}
|
|
131
|
-
else
|
|
132
|
-
entries.push({ ...entry });
|
|
133
|
-
}
|
|
134
|
-
await handle.assertUnchanged();
|
|
135
|
-
return validateWorkspaceManifest({ version: 1, hash: descriptor.hash, entries });
|
|
136
|
-
}
|
|
137
|
-
finally {
|
|
138
|
-
await handle.close();
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
/** Open only a blob named by this immutable workspace's validated manifest. */
|
|
142
|
-
export async function openWorkspaceBlob(descriptor, value, hash, { signal } = {}) {
|
|
143
|
-
const manifest = validateWorkspaceManifest(value);
|
|
144
|
-
if (descriptor.mode !== 'copy' || descriptor.hash !== manifest.hash || !HASH.test(hash))
|
|
145
|
-
throw failure('Blob does not belong to the requested copy workspace.');
|
|
146
|
-
const entry = validatedManifests.get(manifest).get(hash);
|
|
147
|
-
if (!entry)
|
|
148
|
-
throw failure('Blob is not present in this workspace.');
|
|
149
|
-
const expectedRoot = path.join(descriptor.stateDir, 'workspaces', manifest.hash);
|
|
150
|
-
if (!path.isAbsolute(descriptor.stateDir) || descriptor.path !== expectedRoot || await realpath(expectedRoot) !== expectedRoot || !(await lstat(expectedRoot)).isDirectory()) {
|
|
151
|
-
throw failure('Workspace blob root is invalid.');
|
|
152
|
-
}
|
|
153
|
-
const parts = entry.path.split('/');
|
|
154
|
-
for (let index = 1; index < parts.length; index++) {
|
|
155
|
-
const parent = await lstat(path.join(expectedRoot, ...parts.slice(0, index)));
|
|
156
|
-
if (!parent.isDirectory() || parent.isSymbolicLink())
|
|
157
|
-
throw failure('Workspace blob has an invalid directory ancestor.');
|
|
158
|
-
}
|
|
159
|
-
signal?.throwIfAborted();
|
|
160
|
-
const file = await open(path.join(expectedRoot, entry.path), constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
161
|
-
try {
|
|
162
|
-
const info = await file.stat();
|
|
163
|
-
if (!info.isFile() || info.size !== entry.size || (info.mode & 0o222) !== 0)
|
|
164
|
-
throw failure('Workspace blob changed or is not a readonly file.');
|
|
165
|
-
signal?.throwIfAborted();
|
|
166
|
-
return { stream: file.createReadStream({ signal }), size: entry.size };
|
|
167
|
-
}
|
|
168
|
-
catch (error) {
|
|
169
|
-
await file.close();
|
|
170
|
-
throw error;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
async function ensureDirectory(directory) {
|
|
174
|
-
const absolute = path.resolve(directory);
|
|
175
|
-
const parent = path.dirname(absolute);
|
|
176
|
-
if (parent !== absolute)
|
|
177
|
-
await ensureDirectory(parent);
|
|
178
|
-
try {
|
|
179
|
-
await mkdir(absolute, { mode: 0o700 });
|
|
180
|
-
}
|
|
181
|
-
catch (error) {
|
|
182
|
-
if (errorCode(error) !== 'EEXIST')
|
|
183
|
-
throw error;
|
|
184
|
-
}
|
|
185
|
-
const info = await lstat(absolute);
|
|
186
|
-
if (!info.isDirectory() || info.isSymbolicLink() || await realpath(absolute) !== absolute)
|
|
187
|
-
throw failure('Workspace transfer state paths must not contain symlinks.');
|
|
188
|
-
}
|
|
189
|
-
async function validBlob(filename, hash, size, signal) {
|
|
190
|
-
let file;
|
|
191
|
-
try {
|
|
192
|
-
file = await open(filename, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
193
|
-
}
|
|
194
|
-
catch (error) {
|
|
195
|
-
if (errorCode(error) === 'ENOENT')
|
|
196
|
-
return false;
|
|
197
|
-
throw error;
|
|
198
|
-
}
|
|
199
|
-
try {
|
|
200
|
-
const before = await file.stat({ bigint: true });
|
|
201
|
-
if (!before.isFile())
|
|
202
|
-
throw failure('Workspace blob cache entry must be a regular file.');
|
|
203
|
-
if (before.size !== BigInt(size) || (before.mode & 146n) !== 0n)
|
|
204
|
-
return false;
|
|
205
|
-
const hashState = createHash('sha256');
|
|
206
|
-
const buffer = Buffer.allocUnsafe(128 * 1024);
|
|
207
|
-
let position = 0;
|
|
208
|
-
while (true) {
|
|
209
|
-
signal?.throwIfAborted();
|
|
210
|
-
const { bytesRead } = await file.read(buffer, 0, buffer.length, position);
|
|
211
|
-
if (!bytesRead)
|
|
212
|
-
break;
|
|
213
|
-
hashState.update(buffer.subarray(0, bytesRead));
|
|
214
|
-
position += bytesRead;
|
|
215
|
-
}
|
|
216
|
-
const after = await file.stat({ bigint: true });
|
|
217
|
-
return position === size && before.ino === after.ino && before.ctimeNs === after.ctimeNs && before.mtimeNs === after.mtimeNs && hashState.digest('hex') === hash;
|
|
218
|
-
}
|
|
219
|
-
finally {
|
|
220
|
-
await file.close();
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
async function writeVerifiedBlob(source, filename, hash, size, signal) {
|
|
224
|
-
let file;
|
|
225
|
-
try {
|
|
226
|
-
file = await open(filename, 'wx', 0o600);
|
|
227
|
-
}
|
|
228
|
-
catch (error) {
|
|
229
|
-
source.destroy();
|
|
230
|
-
throw error;
|
|
231
|
-
}
|
|
232
|
-
const hashState = createHash('sha256');
|
|
233
|
-
let bytes = 0;
|
|
234
|
-
const check = new Transform({
|
|
235
|
-
transform(chunk, _encoding, callback) {
|
|
236
|
-
bytes += chunk.length;
|
|
237
|
-
if (bytes > size) {
|
|
238
|
-
callback(failure('Downloaded workspace blob exceeds its declared size.'));
|
|
239
|
-
return;
|
|
240
|
-
}
|
|
241
|
-
hashState.update(chunk);
|
|
242
|
-
callback(null, chunk);
|
|
243
|
-
},
|
|
244
|
-
flush(callback) {
|
|
245
|
-
callback(bytes !== size || hashState.digest('hex') !== hash ? failure('Downloaded workspace blob failed content verification.') : null);
|
|
246
|
-
},
|
|
247
|
-
});
|
|
248
|
-
try {
|
|
249
|
-
await pipeline(source, check, file.createWriteStream(), { signal });
|
|
250
|
-
}
|
|
251
|
-
finally {
|
|
252
|
-
await file.close();
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
export async function materializeWorkspace({ manifest: value, stateDir, fetchBlob, signal, onProgress }) {
|
|
256
|
-
const manifest = validateWorkspaceManifest(value);
|
|
257
|
-
if (typeof stateDir !== 'string' || !stateDir || !path.isAbsolute(stateDir))
|
|
258
|
-
throw failure('An absolute external transfer state directory is required.');
|
|
259
|
-
signal?.throwIfAborted();
|
|
260
|
-
stateDir = path.resolve(stateDir);
|
|
261
|
-
const cacheRoot = path.join(stateDir, 'workspaces');
|
|
262
|
-
const blobRoot = path.join(stateDir, 'workspace-blobs');
|
|
263
|
-
await ensureDirectory(cacheRoot);
|
|
264
|
-
await ensureDirectory(blobRoot);
|
|
265
|
-
const destination = path.join(cacheRoot, manifest.hash);
|
|
266
|
-
const progress = { downloadedFiles: 0, downloadedBytes: 0, reusedFiles: 0, totalFiles: manifest.entries.filter(entry => entry.type === 'file').length };
|
|
267
|
-
const notify = () => onProgress?.(Object.freeze({ ...progress }));
|
|
268
|
-
const release = await acquireWorkspacePublication(cacheRoot, manifest.hash, signal);
|
|
269
|
-
let stage;
|
|
270
|
-
try {
|
|
271
|
-
let existing = false;
|
|
272
|
-
try {
|
|
273
|
-
const info = await lstat(destination);
|
|
274
|
-
if (!info.isDirectory() || info.isSymbolicLink())
|
|
275
|
-
throw failure('Imported workspace cache root must be a regular directory.');
|
|
276
|
-
const inspected = await inspectWorkspace(destination, { signal, requireReadonly: true });
|
|
277
|
-
if (inspected.hash !== manifest.hash)
|
|
278
|
-
throw failure('Imported workspace cache content does not match its hash.');
|
|
279
|
-
existing = true;
|
|
280
|
-
}
|
|
281
|
-
catch (error) {
|
|
282
|
-
if (errorCode(error) !== 'ENOENT')
|
|
283
|
-
throw error;
|
|
284
|
-
}
|
|
285
|
-
if (existing) {
|
|
286
|
-
progress.reusedFiles = progress.totalFiles;
|
|
287
|
-
notify();
|
|
288
|
-
}
|
|
289
|
-
else {
|
|
290
|
-
stage = path.join(cacheRoot, `.transfer-${randomUUID()}`);
|
|
291
|
-
await mkdir(stage, { mode: 0o700 });
|
|
292
|
-
for (const entry of manifest.entries) {
|
|
293
|
-
signal?.throwIfAborted();
|
|
294
|
-
const target = path.join(stage, entry.path);
|
|
295
|
-
if (entry.type === 'directory') {
|
|
296
|
-
await mkdir(target, { mode: 0o700 });
|
|
297
|
-
continue;
|
|
298
|
-
}
|
|
299
|
-
if (entry.type === 'symlink') {
|
|
300
|
-
await symlink(entry.target, target);
|
|
301
|
-
continue;
|
|
302
|
-
}
|
|
303
|
-
const blob = path.join(blobRoot, entry.content);
|
|
304
|
-
const releaseBlob = await acquireWorkspacePublication(blobRoot, entry.content, signal);
|
|
305
|
-
let scratch;
|
|
306
|
-
try {
|
|
307
|
-
if (await validBlob(blob, entry.content, entry.size, signal))
|
|
308
|
-
progress.reusedFiles++;
|
|
309
|
-
else {
|
|
310
|
-
// A corrupt byte cache is replaceable; published review snapshots are never repaired in place.
|
|
311
|
-
await unlink(blob).catch(error => { if (errorCode(error) !== 'ENOENT')
|
|
312
|
-
throw error; });
|
|
313
|
-
const fetched = await fetchBlob(entry.content, signal);
|
|
314
|
-
// Web and Node streams have async iterators too. Keep their native cancellation
|
|
315
|
-
// adapters so an idle read is destroyed immediately when preparation is aborted.
|
|
316
|
-
const source = fetched instanceof Readable ? fetched
|
|
317
|
-
: typeof fetched.getReader === 'function'
|
|
318
|
-
? Readable.fromWeb(fetched)
|
|
319
|
-
: Readable.from(fetched);
|
|
320
|
-
scratch = path.join(blobRoot, `.download-${randomUUID()}`);
|
|
321
|
-
await writeVerifiedBlob(source, scratch, entry.content, entry.size, signal);
|
|
322
|
-
await chmod(scratch, 0o444);
|
|
323
|
-
signal?.throwIfAborted();
|
|
324
|
-
await rename(scratch, blob);
|
|
325
|
-
scratch = undefined;
|
|
326
|
-
progress.downloadedFiles++;
|
|
327
|
-
progress.downloadedBytes += entry.size;
|
|
328
|
-
}
|
|
329
|
-
const source = await open(blob, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
330
|
-
try {
|
|
331
|
-
await writeVerifiedBlob(source.createReadStream(), target, entry.content, entry.size, signal);
|
|
332
|
-
}
|
|
333
|
-
finally {
|
|
334
|
-
await source.close();
|
|
335
|
-
}
|
|
336
|
-
await chmod(target, 0o444 | entry.executable);
|
|
337
|
-
notify();
|
|
338
|
-
}
|
|
339
|
-
finally {
|
|
340
|
-
if (scratch)
|
|
341
|
-
await unlink(scratch).catch(() => { });
|
|
342
|
-
await releaseBlob();
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
for (const entry of [...manifest.entries].reverse()) {
|
|
346
|
-
if (entry.type === 'directory')
|
|
347
|
-
await chmod(path.join(stage, entry.path), 0o444 | entry.executable);
|
|
348
|
-
}
|
|
349
|
-
await chmod(stage, 0o555);
|
|
350
|
-
const inspected = await inspectWorkspace(stage, { signal, requireReadonly: true });
|
|
351
|
-
if (inspected.hash !== manifest.hash)
|
|
352
|
-
throw failure('Reconstructed workspace does not match its snapshot hash.');
|
|
353
|
-
signal?.throwIfAborted();
|
|
354
|
-
await rename(stage, destination);
|
|
355
|
-
stage = undefined;
|
|
356
|
-
}
|
|
357
|
-
const inspected = await inspectWorkspace(destination, { signal, requireReadonly: true });
|
|
358
|
-
if (inspected.hash !== manifest.hash)
|
|
359
|
-
throw failure('Imported workspace changed before it could be used.');
|
|
360
|
-
const descriptor = {
|
|
361
|
-
version: 1, mode: 'copy', sourcePath: destination, path: destination,
|
|
362
|
-
hash: manifest.hash, stateDir, baselineMetadataHash: inspected.metadataHash,
|
|
363
|
-
};
|
|
364
|
-
return { descriptor: Object.freeze(descriptor), downloadedFiles: progress.downloadedFiles, downloadedBytes: progress.downloadedBytes, reusedFiles: progress.reusedFiles };
|
|
365
|
-
}
|
|
366
|
-
finally {
|
|
367
|
-
if (stage)
|
|
368
|
-
await removeOwnedWorkspaceTree(stage);
|
|
369
|
-
await release();
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
//# sourceMappingURL=transfer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../../src/workspaces/transfer.ts"],"names":[],"mappings":"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"}
|