@elaraai/e3-core 0.0.1-beta.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/LICENSE.md +50 -0
- package/README.md +76 -0
- package/dist/src/dataflow.d.ts +96 -0
- package/dist/src/dataflow.d.ts.map +1 -0
- package/dist/src/dataflow.js +433 -0
- package/dist/src/dataflow.js.map +1 -0
- package/dist/src/errors.d.ts +87 -0
- package/dist/src/errors.d.ts.map +1 -0
- package/dist/src/errors.js +178 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/executions.d.ts +163 -0
- package/dist/src/executions.d.ts.map +1 -0
- package/dist/src/executions.js +535 -0
- package/dist/src/executions.js.map +1 -0
- package/dist/src/formats.d.ts +38 -0
- package/dist/src/formats.d.ts.map +1 -0
- package/dist/src/formats.js +115 -0
- package/dist/src/formats.js.map +1 -0
- package/dist/src/gc.d.ts +54 -0
- package/dist/src/gc.d.ts.map +1 -0
- package/dist/src/gc.js +232 -0
- package/dist/src/gc.js.map +1 -0
- package/dist/src/index.d.ts +23 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +68 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/objects.d.ts +62 -0
- package/dist/src/objects.d.ts.map +1 -0
- package/dist/src/objects.js +245 -0
- package/dist/src/objects.js.map +1 -0
- package/dist/src/packages.d.ts +85 -0
- package/dist/src/packages.d.ts.map +1 -0
- package/dist/src/packages.js +355 -0
- package/dist/src/packages.js.map +1 -0
- package/dist/src/repository.d.ts +38 -0
- package/dist/src/repository.d.ts.map +1 -0
- package/dist/src/repository.js +103 -0
- package/dist/src/repository.js.map +1 -0
- package/dist/src/tasks.d.ts +63 -0
- package/dist/src/tasks.d.ts.map +1 -0
- package/dist/src/tasks.js +145 -0
- package/dist/src/tasks.js.map +1 -0
- package/dist/src/test-helpers.d.ts +44 -0
- package/dist/src/test-helpers.d.ts.map +1 -0
- package/dist/src/test-helpers.js +141 -0
- package/dist/src/test-helpers.js.map +1 -0
- package/dist/src/trees.d.ts +156 -0
- package/dist/src/trees.d.ts.map +1 -0
- package/dist/src/trees.js +607 -0
- package/dist/src/trees.js.map +1 -0
- package/dist/src/workspaces.d.ts +116 -0
- package/dist/src/workspaces.d.ts.map +1 -0
- package/dist/src/workspaces.js +356 -0
- package/dist/src/workspaces.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Package operations for e3 repositories.
|
|
7
|
+
*
|
|
8
|
+
* Handles importing, exporting, and managing packages in the content-addressed
|
|
9
|
+
* object store.
|
|
10
|
+
*/
|
|
11
|
+
import * as fs from 'fs/promises';
|
|
12
|
+
import { createWriteStream } from 'fs';
|
|
13
|
+
import * as path from 'path';
|
|
14
|
+
import yauzl from 'yauzl';
|
|
15
|
+
import yazl from 'yazl';
|
|
16
|
+
import { decodeBeast2For } from '@elaraai/east';
|
|
17
|
+
import { PackageObjectType } from '@elaraai/e3-types';
|
|
18
|
+
import { objectWrite, objectRead } from './objects.js';
|
|
19
|
+
import { PackageNotFoundError, PackageInvalidError, isNotFoundError, } from './errors.js';
|
|
20
|
+
/**
|
|
21
|
+
* Import a package from a .zip file into the repository.
|
|
22
|
+
*
|
|
23
|
+
* Extracts objects to `objects/`, creates ref at `packages/<name>/<version>`.
|
|
24
|
+
*
|
|
25
|
+
* @param repoPath - Path to .e3 repository
|
|
26
|
+
* @param zipPath - Path to the .zip package file
|
|
27
|
+
* @returns Import result with package name, version, and stats
|
|
28
|
+
*/
|
|
29
|
+
export async function packageImport(repoPath, zipPath) {
|
|
30
|
+
// Open the zip file
|
|
31
|
+
const zipfile = await openZip(zipPath);
|
|
32
|
+
let packageName;
|
|
33
|
+
let packageVersion;
|
|
34
|
+
let packageHash;
|
|
35
|
+
let objectCount = 0;
|
|
36
|
+
try {
|
|
37
|
+
// Iterate through all entries
|
|
38
|
+
for await (const entry of iterateZipEntries(zipfile)) {
|
|
39
|
+
const { fileName, getData } = entry;
|
|
40
|
+
// Skip directory entries
|
|
41
|
+
if (fileName.endsWith('/')) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
// Handle package ref: packages/<name>/<version>
|
|
45
|
+
if (fileName.startsWith('packages/')) {
|
|
46
|
+
const parts = fileName.split('/');
|
|
47
|
+
if (parts.length === 3) {
|
|
48
|
+
packageName = parts[1];
|
|
49
|
+
packageVersion = parts[2];
|
|
50
|
+
// Read the hash from the ref file
|
|
51
|
+
const data = await getData();
|
|
52
|
+
packageHash = data.toString('utf-8').trim();
|
|
53
|
+
// Write the ref to the repository
|
|
54
|
+
const refDir = path.join(repoPath, 'packages', packageName);
|
|
55
|
+
await fs.mkdir(refDir, { recursive: true });
|
|
56
|
+
const refPath = path.join(refDir, packageVersion);
|
|
57
|
+
await fs.writeFile(refPath, packageHash + '\n');
|
|
58
|
+
}
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
// Handle object: objects/<ab>/<cdef...>.beast2
|
|
62
|
+
if (fileName.startsWith('objects/')) {
|
|
63
|
+
const data = await getData();
|
|
64
|
+
// Store the object (objectWrite will verify the hash matches)
|
|
65
|
+
await objectWrite(repoPath, data);
|
|
66
|
+
objectCount++;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
// Unknown entry type - ignore for forward compatibility
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
// Close the zip file
|
|
74
|
+
zipfile.close();
|
|
75
|
+
}
|
|
76
|
+
if (!packageName || !packageVersion || !packageHash) {
|
|
77
|
+
throw new PackageInvalidError('missing package ref');
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
name: packageName,
|
|
81
|
+
version: packageVersion,
|
|
82
|
+
packageHash,
|
|
83
|
+
objectCount,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Remove a package ref from the repository.
|
|
88
|
+
*
|
|
89
|
+
* Objects remain until gc is run.
|
|
90
|
+
*
|
|
91
|
+
* @param repoPath - Path to .e3 repository
|
|
92
|
+
* @param name - Package name
|
|
93
|
+
* @param version - Package version
|
|
94
|
+
* @throws {PackageNotFoundError} If package doesn't exist
|
|
95
|
+
*/
|
|
96
|
+
export async function packageRemove(repoPath, name, version) {
|
|
97
|
+
const refPath = path.join(repoPath, 'packages', name, version);
|
|
98
|
+
try {
|
|
99
|
+
await fs.unlink(refPath);
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
if (isNotFoundError(err)) {
|
|
103
|
+
throw new PackageNotFoundError(name, version);
|
|
104
|
+
}
|
|
105
|
+
throw err;
|
|
106
|
+
}
|
|
107
|
+
// Try to remove the package name directory if empty
|
|
108
|
+
const packageDir = path.join(repoPath, 'packages', name);
|
|
109
|
+
try {
|
|
110
|
+
await fs.rmdir(packageDir);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// Directory not empty, that's fine
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* List all installed packages.
|
|
118
|
+
*
|
|
119
|
+
* @param repoPath - Path to .e3 repository
|
|
120
|
+
* @returns Array of (name, version) pairs
|
|
121
|
+
*/
|
|
122
|
+
export async function packageList(repoPath) {
|
|
123
|
+
const packagesDir = path.join(repoPath, 'packages');
|
|
124
|
+
const packages = [];
|
|
125
|
+
try {
|
|
126
|
+
const names = await fs.readdir(packagesDir);
|
|
127
|
+
for (const name of names) {
|
|
128
|
+
const nameDir = path.join(packagesDir, name);
|
|
129
|
+
const stat = await fs.stat(nameDir);
|
|
130
|
+
if (stat.isDirectory()) {
|
|
131
|
+
const versions = await fs.readdir(nameDir);
|
|
132
|
+
for (const version of versions) {
|
|
133
|
+
packages.push({ name, version });
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// packages directory doesn't exist or is empty
|
|
140
|
+
}
|
|
141
|
+
return packages;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Resolve a package to its PackageObject hash.
|
|
145
|
+
*
|
|
146
|
+
* @param repoPath - Path to .e3 repository
|
|
147
|
+
* @param name - Package name
|
|
148
|
+
* @param version - Package version
|
|
149
|
+
* @returns PackageObject hash
|
|
150
|
+
* @throws {PackageNotFoundError} If package doesn't exist
|
|
151
|
+
*/
|
|
152
|
+
export async function packageResolve(repoPath, name, version) {
|
|
153
|
+
const refPath = path.join(repoPath, 'packages', name, version);
|
|
154
|
+
try {
|
|
155
|
+
const content = await fs.readFile(refPath, 'utf-8');
|
|
156
|
+
return content.trim();
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
if (isNotFoundError(err)) {
|
|
160
|
+
throw new PackageNotFoundError(name, version);
|
|
161
|
+
}
|
|
162
|
+
throw err;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Read and parse a PackageObject.
|
|
167
|
+
*
|
|
168
|
+
* @param repoPath - Path to .e3 repository
|
|
169
|
+
* @param name - Package name
|
|
170
|
+
* @param version - Package version
|
|
171
|
+
* @returns Parsed PackageObject
|
|
172
|
+
* @throws {PackageNotFoundError} If package doesn't exist
|
|
173
|
+
*/
|
|
174
|
+
export async function packageRead(repoPath, name, version) {
|
|
175
|
+
const hash = await packageResolve(repoPath, name, version);
|
|
176
|
+
const data = await objectRead(repoPath, hash);
|
|
177
|
+
const decoder = decodeBeast2For(PackageObjectType);
|
|
178
|
+
return decoder(Buffer.from(data));
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Fixed mtime for deterministic zip output (Unix epoch)
|
|
182
|
+
*/
|
|
183
|
+
const DETERMINISTIC_MTIME = new Date(0);
|
|
184
|
+
/**
|
|
185
|
+
* Export a package to a .zip file.
|
|
186
|
+
*
|
|
187
|
+
* Collects the package object and all transitively referenced objects.
|
|
188
|
+
*
|
|
189
|
+
* @param repoPath - Path to .e3 repository
|
|
190
|
+
* @param name - Package name
|
|
191
|
+
* @param version - Package version
|
|
192
|
+
* @param zipPath - Path to write the .zip file
|
|
193
|
+
* @returns Export result with package hash and object count
|
|
194
|
+
*/
|
|
195
|
+
export async function packageExport(repoPath, name, version, zipPath) {
|
|
196
|
+
const partialPath = `${zipPath}.partial`;
|
|
197
|
+
// Resolve package to hash
|
|
198
|
+
const packageHash = await packageResolve(repoPath, name, version);
|
|
199
|
+
// Create zip file
|
|
200
|
+
const zipfile = new yazl.ZipFile();
|
|
201
|
+
// Track which objects we've added to avoid duplicates
|
|
202
|
+
const addedObjects = new Set();
|
|
203
|
+
// Helper to add an object to the zip
|
|
204
|
+
const addObject = async (hash) => {
|
|
205
|
+
if (addedObjects.has(hash))
|
|
206
|
+
return;
|
|
207
|
+
addedObjects.add(hash);
|
|
208
|
+
const data = await objectRead(repoPath, hash);
|
|
209
|
+
const zipPath = `objects/${hash.slice(0, 2)}/${hash.slice(2)}.beast2`;
|
|
210
|
+
zipfile.addBuffer(Buffer.from(data), zipPath, { mtime: DETERMINISTIC_MTIME });
|
|
211
|
+
};
|
|
212
|
+
// Helper to collect children from a tree object
|
|
213
|
+
// Tree objects are encoded as structs with DataRef fields
|
|
214
|
+
const collectTreeChildren = async (treeData) => {
|
|
215
|
+
// Decode as a generic structure and extract DataRefs
|
|
216
|
+
// This is a bit tricky since trees have dynamic structure
|
|
217
|
+
// For now, we'll use a heuristic: scan for hash patterns in the beast2 data
|
|
218
|
+
// A more robust approach would be to track the structure during export
|
|
219
|
+
const dataStr = Buffer.from(treeData).toString('latin1');
|
|
220
|
+
// Look for hash patterns (64 hex chars) that might be object references
|
|
221
|
+
// Use matchAll to avoid regex state issues
|
|
222
|
+
const hashPattern = /[a-f0-9]{64}/g;
|
|
223
|
+
const matches = dataStr.matchAll(hashPattern);
|
|
224
|
+
for (const match of matches) {
|
|
225
|
+
const potentialHash = match[0];
|
|
226
|
+
// Skip if we've already added this object
|
|
227
|
+
if (addedObjects.has(potentialHash)) {
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
// Try to load this as an object - if it exists, it's a reference
|
|
231
|
+
try {
|
|
232
|
+
await addObject(potentialHash);
|
|
233
|
+
// Recursively collect children from this object
|
|
234
|
+
const childData = await objectRead(repoPath, potentialHash);
|
|
235
|
+
await collectTreeChildren(childData);
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
// Object doesn't exist, not a valid reference - remove from set
|
|
239
|
+
addedObjects.delete(potentialHash);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
};
|
|
243
|
+
// Add the package object first
|
|
244
|
+
await addObject(packageHash);
|
|
245
|
+
// Load and parse the package object
|
|
246
|
+
const packageData = await objectRead(repoPath, packageHash);
|
|
247
|
+
const decoder = decodeBeast2For(PackageObjectType);
|
|
248
|
+
const packageObject = decoder(Buffer.from(packageData));
|
|
249
|
+
// Collect all task objects
|
|
250
|
+
for (const taskHash of packageObject.tasks.values()) {
|
|
251
|
+
await addObject(taskHash);
|
|
252
|
+
// Note: Task objects reference datasets by path, not by hash,
|
|
253
|
+
// so we don't need to recursively collect from them
|
|
254
|
+
}
|
|
255
|
+
// Collect the root tree and all its children
|
|
256
|
+
const rootTreeHash = packageObject.data.value;
|
|
257
|
+
await addObject(rootTreeHash);
|
|
258
|
+
const rootTreeData = await objectRead(repoPath, rootTreeHash);
|
|
259
|
+
await collectTreeChildren(rootTreeData);
|
|
260
|
+
// Write the package ref
|
|
261
|
+
const refPath = `packages/${name}/${version}`;
|
|
262
|
+
zipfile.addBuffer(Buffer.from(packageHash + '\n'), refPath, { mtime: DETERMINISTIC_MTIME });
|
|
263
|
+
// Finalize and write zip to disk
|
|
264
|
+
await new Promise((resolve, reject) => {
|
|
265
|
+
const writeStream = createWriteStream(partialPath);
|
|
266
|
+
zipfile.outputStream.pipe(writeStream);
|
|
267
|
+
zipfile.outputStream.on('error', reject);
|
|
268
|
+
writeStream.on('error', reject);
|
|
269
|
+
writeStream.on('close', resolve);
|
|
270
|
+
zipfile.end();
|
|
271
|
+
});
|
|
272
|
+
// Atomic rename to final path
|
|
273
|
+
await fs.rename(partialPath, zipPath);
|
|
274
|
+
return {
|
|
275
|
+
packageHash,
|
|
276
|
+
objectCount: addedObjects.size,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Open a zip file for reading
|
|
281
|
+
*/
|
|
282
|
+
function openZip(zipPath) {
|
|
283
|
+
return new Promise((resolve, reject) => {
|
|
284
|
+
yauzl.open(zipPath, { lazyEntries: true }, (err, zipfile) => {
|
|
285
|
+
if (err)
|
|
286
|
+
return reject(err);
|
|
287
|
+
if (!zipfile)
|
|
288
|
+
return reject(new Error('No zipfile'));
|
|
289
|
+
resolve(zipfile);
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Async iterator over zip entries
|
|
295
|
+
*/
|
|
296
|
+
async function* iterateZipEntries(zipfile) {
|
|
297
|
+
// Create a queue for entries
|
|
298
|
+
const entryQueue = [];
|
|
299
|
+
let resolveNext = null;
|
|
300
|
+
let rejectNext = null;
|
|
301
|
+
zipfile.on('entry', (entry) => {
|
|
302
|
+
entryQueue.push(entry);
|
|
303
|
+
if (resolveNext) {
|
|
304
|
+
resolveNext();
|
|
305
|
+
resolveNext = null;
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
zipfile.on('end', () => {
|
|
309
|
+
entryQueue.push(null); // Signal end
|
|
310
|
+
if (resolveNext) {
|
|
311
|
+
resolveNext();
|
|
312
|
+
resolveNext = null;
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
zipfile.on('error', (err) => {
|
|
316
|
+
if (rejectNext) {
|
|
317
|
+
rejectNext(err);
|
|
318
|
+
rejectNext = null;
|
|
319
|
+
}
|
|
320
|
+
});
|
|
321
|
+
// Start reading
|
|
322
|
+
zipfile.readEntry();
|
|
323
|
+
while (true) {
|
|
324
|
+
// Wait for an entry if queue is empty
|
|
325
|
+
if (entryQueue.length === 0) {
|
|
326
|
+
await new Promise((resolve, reject) => {
|
|
327
|
+
resolveNext = resolve;
|
|
328
|
+
rejectNext = reject;
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
const entry = entryQueue.shift();
|
|
332
|
+
if (entry === null || entry === undefined) {
|
|
333
|
+
return; // End of entries
|
|
334
|
+
}
|
|
335
|
+
// Create getData function for this entry
|
|
336
|
+
const getData = () => {
|
|
337
|
+
return new Promise((resolve, reject) => {
|
|
338
|
+
zipfile.openReadStream(entry, (err, readStream) => {
|
|
339
|
+
if (err)
|
|
340
|
+
return reject(err);
|
|
341
|
+
if (!readStream)
|
|
342
|
+
return reject(new Error('No read stream'));
|
|
343
|
+
const chunks = [];
|
|
344
|
+
readStream.on('data', (chunk) => chunks.push(chunk));
|
|
345
|
+
readStream.on('end', () => resolve(Buffer.concat(chunks)));
|
|
346
|
+
readStream.on('error', reject);
|
|
347
|
+
});
|
|
348
|
+
});
|
|
349
|
+
};
|
|
350
|
+
yield { fileName: entry.fileName, getData };
|
|
351
|
+
// Read next entry
|
|
352
|
+
zipfile.readEntry();
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
//# sourceMappingURL=packages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packages.js","sourceRoot":"","sources":["../../src/packages.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Result of initializing an e3 repository
|
|
7
|
+
*/
|
|
8
|
+
export interface InitRepositoryResult {
|
|
9
|
+
success: boolean;
|
|
10
|
+
e3Dir: string;
|
|
11
|
+
error?: Error;
|
|
12
|
+
alreadyExists?: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Initialize a new e3 repository
|
|
16
|
+
*
|
|
17
|
+
* Creates:
|
|
18
|
+
* - objects/
|
|
19
|
+
* - packages/
|
|
20
|
+
* - executions/
|
|
21
|
+
* - workspaces/
|
|
22
|
+
*
|
|
23
|
+
* Pure business logic - no UI dependencies
|
|
24
|
+
*/
|
|
25
|
+
export declare function repoInit(repoPath: string): InitRepositoryResult;
|
|
26
|
+
/**
|
|
27
|
+
* Find the e3 repository directory
|
|
28
|
+
*
|
|
29
|
+
* Searches:
|
|
30
|
+
* 1. E3_REPO environment variable
|
|
31
|
+
* 2. Current directory and parents (like git)
|
|
32
|
+
*/
|
|
33
|
+
export declare function repoFind(startPath?: string): string | null;
|
|
34
|
+
/**
|
|
35
|
+
* Get the e3 repository, throw error if not found
|
|
36
|
+
*/
|
|
37
|
+
export declare function repoGet(repoPath?: string): string;
|
|
38
|
+
//# sourceMappingURL=repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,oBAAoB,CAyC/D;AAYD;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA0B1D;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAQjD"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
/**
|
|
8
|
+
* Initialize a new e3 repository
|
|
9
|
+
*
|
|
10
|
+
* Creates:
|
|
11
|
+
* - objects/
|
|
12
|
+
* - packages/
|
|
13
|
+
* - executions/
|
|
14
|
+
* - workspaces/
|
|
15
|
+
*
|
|
16
|
+
* Pure business logic - no UI dependencies
|
|
17
|
+
*/
|
|
18
|
+
export function repoInit(repoPath) {
|
|
19
|
+
const targetPath = path.resolve(repoPath);
|
|
20
|
+
const e3Dir = path.join(targetPath, '.e3');
|
|
21
|
+
// Check if .e3 already exists
|
|
22
|
+
if (fs.existsSync(e3Dir)) {
|
|
23
|
+
return {
|
|
24
|
+
success: false,
|
|
25
|
+
e3Dir,
|
|
26
|
+
alreadyExists: true,
|
|
27
|
+
error: new Error(`e3 repository already exists at ${e3Dir}`),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
// Create main .e3 directory
|
|
32
|
+
fs.mkdirSync(e3Dir, { recursive: true });
|
|
33
|
+
// Create objects directory (content-addressed storage)
|
|
34
|
+
fs.mkdirSync(path.join(e3Dir, 'objects'), { recursive: true });
|
|
35
|
+
// Create packages directory (package refs: packages/<name>/<version> -> hash)
|
|
36
|
+
fs.mkdirSync(path.join(e3Dir, 'packages'), { recursive: true });
|
|
37
|
+
// Create executions directory (execution cache: executions/<hash>/output -> hash)
|
|
38
|
+
fs.mkdirSync(path.join(e3Dir, 'executions'), { recursive: true });
|
|
39
|
+
// Create workspaces directory (workspace state)
|
|
40
|
+
fs.mkdirSync(path.join(e3Dir, 'workspaces'), { recursive: true });
|
|
41
|
+
return {
|
|
42
|
+
success: true,
|
|
43
|
+
e3Dir,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
return {
|
|
48
|
+
success: false,
|
|
49
|
+
e3Dir,
|
|
50
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Validate that a directory is a valid e3 repository
|
|
56
|
+
* @internal
|
|
57
|
+
*/
|
|
58
|
+
function isValidRepository(repoPath) {
|
|
59
|
+
const requiredDirs = ['objects', 'packages', 'executions', 'workspaces'];
|
|
60
|
+
return requiredDirs.every((dir) => fs.existsSync(path.join(repoPath, dir)));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Find the e3 repository directory
|
|
64
|
+
*
|
|
65
|
+
* Searches:
|
|
66
|
+
* 1. E3_REPO environment variable
|
|
67
|
+
* 2. Current directory and parents (like git)
|
|
68
|
+
*/
|
|
69
|
+
export function repoFind(startPath) {
|
|
70
|
+
// 1. Check E3_REPO environment variable
|
|
71
|
+
if (process.env.E3_REPO) {
|
|
72
|
+
const repoPath = path.resolve(process.env.E3_REPO);
|
|
73
|
+
if (fs.existsSync(repoPath) && isValidRepository(repoPath)) {
|
|
74
|
+
return repoPath;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// 2. Check current directory and parents
|
|
78
|
+
let currentDir = startPath !== undefined ? path.resolve(startPath) : process.cwd();
|
|
79
|
+
while (true) {
|
|
80
|
+
const e3Dir = path.join(currentDir, '.e3');
|
|
81
|
+
if (fs.existsSync(e3Dir) && isValidRepository(e3Dir)) {
|
|
82
|
+
return e3Dir;
|
|
83
|
+
}
|
|
84
|
+
const parentDir = path.dirname(currentDir);
|
|
85
|
+
if (parentDir === currentDir) {
|
|
86
|
+
// Reached root
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
currentDir = parentDir;
|
|
90
|
+
}
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Get the e3 repository, throw error if not found
|
|
95
|
+
*/
|
|
96
|
+
export function repoGet(repoPath) {
|
|
97
|
+
const repo = repoFind(repoPath);
|
|
98
|
+
if (!repo) {
|
|
99
|
+
throw new Error('e3 repository not found. Run `e3 init` to create one.');
|
|
100
|
+
}
|
|
101
|
+
return repo;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import { type TaskObject } from '@elaraai/e3-types';
|
|
6
|
+
/**
|
|
7
|
+
* List task names in a package.
|
|
8
|
+
*
|
|
9
|
+
* @param repoPath - Path to .e3 repository
|
|
10
|
+
* @param name - Package name
|
|
11
|
+
* @param version - Package version
|
|
12
|
+
* @returns Array of task names
|
|
13
|
+
* @throws If package not found
|
|
14
|
+
*/
|
|
15
|
+
export declare function packageListTasks(repoPath: string, name: string, version: string): Promise<string[]>;
|
|
16
|
+
/**
|
|
17
|
+
* Get task details from a package.
|
|
18
|
+
*
|
|
19
|
+
* @param repoPath - Path to .e3 repository
|
|
20
|
+
* @param name - Package name
|
|
21
|
+
* @param version - Package version
|
|
22
|
+
* @param taskName - Name of the task
|
|
23
|
+
* @returns The TaskObject containing runner, inputs, and output
|
|
24
|
+
* @throws {PackageNotFoundError} If package not found
|
|
25
|
+
* @throws {TaskNotFoundError} If task not found in package
|
|
26
|
+
*/
|
|
27
|
+
export declare function packageGetTask(repoPath: string, name: string, version: string, taskName: string): Promise<TaskObject>;
|
|
28
|
+
/**
|
|
29
|
+
* List task names in a workspace.
|
|
30
|
+
*
|
|
31
|
+
* Tasks are defined by the deployed package.
|
|
32
|
+
*
|
|
33
|
+
* @param repoPath - Path to .e3 repository
|
|
34
|
+
* @param ws - Workspace name
|
|
35
|
+
* @returns Array of task names
|
|
36
|
+
* @throws If workspace not found or not deployed
|
|
37
|
+
*/
|
|
38
|
+
export declare function workspaceListTasks(repoPath: string, ws: string): Promise<string[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Get task hash from a workspace.
|
|
41
|
+
*
|
|
42
|
+
* @param repoPath - Path to .e3 repository
|
|
43
|
+
* @param ws - Workspace name
|
|
44
|
+
* @param taskName - Name of the task
|
|
45
|
+
* @returns The hash of the TaskObject
|
|
46
|
+
* @throws {WorkspaceNotFoundError} If workspace not found
|
|
47
|
+
* @throws {WorkspaceNotDeployedError} If workspace not deployed
|
|
48
|
+
* @throws {TaskNotFoundError} If task not found
|
|
49
|
+
*/
|
|
50
|
+
export declare function workspaceGetTaskHash(repoPath: string, ws: string, taskName: string): Promise<string>;
|
|
51
|
+
/**
|
|
52
|
+
* Get task details from a workspace.
|
|
53
|
+
*
|
|
54
|
+
* Tasks are defined by the deployed package.
|
|
55
|
+
*
|
|
56
|
+
* @param repoPath - Path to .e3 repository
|
|
57
|
+
* @param ws - Workspace name
|
|
58
|
+
* @param taskName - Name of the task
|
|
59
|
+
* @returns The TaskObject containing runner, inputs, and output
|
|
60
|
+
* @throws If workspace not deployed or task not found
|
|
61
|
+
*/
|
|
62
|
+
export declare function workspaceGetTask(repoPath: string, ws: string, taskName: string): Promise<TaskObject>;
|
|
63
|
+
//# sourceMappingURL=tasks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/tasks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH,OAAO,EAIL,KAAK,UAAU,EAChB,MAAM,mBAAmB,CAAC;AAgB3B;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,EAAE,CAAC,CAGnB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,CAAC,CAWrB;AAwCD;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,MAAM,EAAE,CAAC,CAGnB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CASjB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,CAAC,CAKrB"}
|