@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.
Files changed (55) hide show
  1. package/LICENSE.md +50 -0
  2. package/README.md +76 -0
  3. package/dist/src/dataflow.d.ts +96 -0
  4. package/dist/src/dataflow.d.ts.map +1 -0
  5. package/dist/src/dataflow.js +433 -0
  6. package/dist/src/dataflow.js.map +1 -0
  7. package/dist/src/errors.d.ts +87 -0
  8. package/dist/src/errors.d.ts.map +1 -0
  9. package/dist/src/errors.js +178 -0
  10. package/dist/src/errors.js.map +1 -0
  11. package/dist/src/executions.d.ts +163 -0
  12. package/dist/src/executions.d.ts.map +1 -0
  13. package/dist/src/executions.js +535 -0
  14. package/dist/src/executions.js.map +1 -0
  15. package/dist/src/formats.d.ts +38 -0
  16. package/dist/src/formats.d.ts.map +1 -0
  17. package/dist/src/formats.js +115 -0
  18. package/dist/src/formats.js.map +1 -0
  19. package/dist/src/gc.d.ts +54 -0
  20. package/dist/src/gc.d.ts.map +1 -0
  21. package/dist/src/gc.js +232 -0
  22. package/dist/src/gc.js.map +1 -0
  23. package/dist/src/index.d.ts +23 -0
  24. package/dist/src/index.d.ts.map +1 -0
  25. package/dist/src/index.js +68 -0
  26. package/dist/src/index.js.map +1 -0
  27. package/dist/src/objects.d.ts +62 -0
  28. package/dist/src/objects.d.ts.map +1 -0
  29. package/dist/src/objects.js +245 -0
  30. package/dist/src/objects.js.map +1 -0
  31. package/dist/src/packages.d.ts +85 -0
  32. package/dist/src/packages.d.ts.map +1 -0
  33. package/dist/src/packages.js +355 -0
  34. package/dist/src/packages.js.map +1 -0
  35. package/dist/src/repository.d.ts +38 -0
  36. package/dist/src/repository.d.ts.map +1 -0
  37. package/dist/src/repository.js +103 -0
  38. package/dist/src/repository.js.map +1 -0
  39. package/dist/src/tasks.d.ts +63 -0
  40. package/dist/src/tasks.d.ts.map +1 -0
  41. package/dist/src/tasks.js +145 -0
  42. package/dist/src/tasks.js.map +1 -0
  43. package/dist/src/test-helpers.d.ts +44 -0
  44. package/dist/src/test-helpers.d.ts.map +1 -0
  45. package/dist/src/test-helpers.js +141 -0
  46. package/dist/src/test-helpers.js.map +1 -0
  47. package/dist/src/trees.d.ts +156 -0
  48. package/dist/src/trees.d.ts.map +1 -0
  49. package/dist/src/trees.js +607 -0
  50. package/dist/src/trees.js.map +1 -0
  51. package/dist/src/workspaces.d.ts +116 -0
  52. package/dist/src/workspaces.d.ts.map +1 -0
  53. package/dist/src/workspaces.js +356 -0
  54. package/dist/src/workspaces.js.map +1 -0
  55. 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"}