@elaraai/e3-api-server 0.0.2-beta.12 → 0.0.2-beta.13
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 +144 -29
- package/dist/src/async-operation-state.d.ts +63 -0
- package/dist/src/async-operation-state.d.ts.map +1 -0
- package/dist/src/async-operation-state.js +193 -0
- package/dist/src/async-operation-state.js.map +1 -0
- package/dist/src/auth/device.d.ts +26 -0
- package/dist/src/auth/device.d.ts.map +1 -0
- package/dist/src/auth/device.js +227 -0
- package/dist/src/auth/device.js.map +1 -0
- package/dist/src/auth/discovery.d.ts +23 -0
- package/dist/src/auth/discovery.d.ts.map +1 -0
- package/dist/src/auth/discovery.js +40 -0
- package/dist/src/auth/discovery.js.map +1 -0
- package/dist/src/auth/index.d.ts +56 -0
- package/dist/src/auth/index.d.ts.map +1 -0
- package/dist/src/auth/index.js +69 -0
- package/dist/src/auth/index.js.map +1 -0
- package/dist/src/auth/keys.d.ts +55 -0
- package/dist/src/auth/keys.d.ts.map +1 -0
- package/dist/src/auth/keys.js +78 -0
- package/dist/src/auth/keys.js.map +1 -0
- package/dist/src/beast2.d.ts +15 -3
- package/dist/src/beast2.d.ts.map +1 -1
- package/dist/src/beast2.js +30 -4
- package/dist/src/beast2.js.map +1 -1
- package/dist/src/cli.js +58 -6
- package/dist/src/cli.js.map +1 -1
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +5 -2
- package/dist/src/errors.js.map +1 -1
- package/dist/src/execution-state.d.ts +54 -0
- package/dist/src/execution-state.d.ts.map +1 -0
- package/dist/src/execution-state.js +150 -0
- package/dist/src/execution-state.js.map +1 -0
- package/dist/src/handlers/dataflow.d.ts +49 -0
- package/dist/src/handlers/dataflow.d.ts.map +1 -0
- package/dist/src/handlers/dataflow.js +371 -0
- package/dist/src/handlers/dataflow.js.map +1 -0
- package/dist/src/handlers/datasets.d.ts +23 -0
- package/dist/src/handlers/datasets.d.ts.map +1 -0
- package/dist/src/handlers/datasets.js +113 -0
- package/dist/src/handlers/datasets.js.map +1 -0
- package/dist/src/handlers/index.d.ts +12 -0
- package/dist/src/handlers/index.d.ts.map +1 -0
- package/dist/src/handlers/index.js +12 -0
- package/dist/src/handlers/index.js.map +1 -0
- package/dist/src/handlers/packages.d.ts +26 -0
- package/dist/src/handlers/packages.d.ts.map +1 -0
- package/dist/src/handlers/packages.js +101 -0
- package/dist/src/handlers/packages.js.map +1 -0
- package/dist/src/handlers/repos.d.ts +11 -0
- package/dist/src/handlers/repos.d.ts.map +1 -0
- package/dist/src/handlers/repos.js +52 -0
- package/dist/src/handlers/repos.js.map +1 -0
- package/dist/src/handlers/repository.d.ts +35 -0
- package/dist/src/handlers/repository.d.ts.map +1 -0
- package/dist/src/handlers/repository.js +142 -0
- package/dist/src/handlers/repository.js.map +1 -0
- package/dist/src/handlers/tasks.d.ts +18 -0
- package/dist/src/handlers/tasks.d.ts.map +1 -0
- package/dist/src/handlers/tasks.js +134 -0
- package/dist/src/handlers/tasks.js.map +1 -0
- package/dist/src/handlers/workspaces.d.ts +34 -0
- package/dist/src/handlers/workspaces.d.ts.map +1 -0
- package/dist/src/handlers/workspaces.js +225 -0
- package/dist/src/handlers/workspaces.js.map +1 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +6 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/middleware/auth.d.ts +51 -0
- package/dist/src/middleware/auth.d.ts.map +1 -0
- package/dist/src/middleware/auth.js +158 -0
- package/dist/src/middleware/auth.js.map +1 -0
- package/dist/src/routes/datasets.d.ts +2 -1
- package/dist/src/routes/datasets.d.ts.map +1 -1
- package/dist/src/routes/datasets.js +50 -85
- package/dist/src/routes/datasets.js.map +1 -1
- package/dist/src/routes/executions.d.ts +2 -1
- package/dist/src/routes/executions.d.ts.map +1 -1
- package/dist/src/routes/executions.js +60 -286
- package/dist/src/routes/executions.js.map +1 -1
- package/dist/src/routes/index.d.ts +11 -0
- package/dist/src/routes/index.d.ts.map +1 -0
- package/dist/src/routes/index.js +11 -0
- package/dist/src/routes/index.js.map +1 -0
- package/dist/src/routes/packages.d.ts +2 -1
- package/dist/src/routes/packages.d.ts.map +1 -1
- package/dist/src/routes/packages.js +42 -105
- package/dist/src/routes/packages.js.map +1 -1
- package/dist/src/routes/repository.d.ts +2 -1
- package/dist/src/routes/repository.d.ts.map +1 -1
- package/dist/src/routes/repository.js +19 -54
- package/dist/src/routes/repository.js.map +1 -1
- package/dist/src/routes/tasks.d.ts +2 -1
- package/dist/src/routes/tasks.d.ts.map +1 -1
- package/dist/src/routes/tasks.js +22 -46
- package/dist/src/routes/tasks.js.map +1 -1
- package/dist/src/routes/workspaces.d.ts +2 -1
- package/dist/src/routes/workspaces.d.ts.map +1 -1
- package/dist/src/routes/workspaces.js +45 -116
- package/dist/src/routes/workspaces.js.map +1 -1
- package/dist/src/server.d.ts +24 -3
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +178 -19
- package/dist/src/server.js.map +1 -1
- package/dist/src/types.d.ts +486 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +209 -2
- package/dist/src/types.js.map +1 -1
- package/package.json +15 -3
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'node:fs/promises';
|
|
6
|
+
import * as os from 'node:os';
|
|
7
|
+
import * as path from 'node:path';
|
|
8
|
+
import { ArrayType, BlobType, NullType } from '@elaraai/east';
|
|
9
|
+
import { packageList, packageImport, packageExport, packageRemove, packageRead, } from '@elaraai/e3-core';
|
|
10
|
+
import { PackageObjectType } from '@elaraai/e3-types';
|
|
11
|
+
import { sendSuccess, sendError } from '../beast2.js';
|
|
12
|
+
import { errorToVariant } from '../errors.js';
|
|
13
|
+
import { PackageListItemType, PackageImportResultType } from '../types.js';
|
|
14
|
+
/**
|
|
15
|
+
* List all packages in the repository.
|
|
16
|
+
*/
|
|
17
|
+
export async function listPackages(storage, repoPath) {
|
|
18
|
+
try {
|
|
19
|
+
const packages = await packageList(storage, repoPath);
|
|
20
|
+
const result = packages.map((pkg) => ({
|
|
21
|
+
name: pkg.name,
|
|
22
|
+
version: pkg.version,
|
|
23
|
+
}));
|
|
24
|
+
return sendSuccess(ArrayType(PackageListItemType), result);
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
return sendError(ArrayType(PackageListItemType), errorToVariant(err));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get package details.
|
|
32
|
+
*/
|
|
33
|
+
export async function getPackage(storage, repoPath, name, version) {
|
|
34
|
+
try {
|
|
35
|
+
const pkg = await packageRead(storage, repoPath, name, version);
|
|
36
|
+
return sendSuccess(PackageObjectType, pkg);
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
return sendError(PackageObjectType, errorToVariant(err));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Import a package from a zip archive.
|
|
44
|
+
*/
|
|
45
|
+
export async function importPackage(storage, repoPath, archive) {
|
|
46
|
+
try {
|
|
47
|
+
// Write to temp file
|
|
48
|
+
const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'e3-import-'));
|
|
49
|
+
const tempPath = path.join(tempDir, 'package.zip');
|
|
50
|
+
try {
|
|
51
|
+
await fs.writeFile(tempPath, archive);
|
|
52
|
+
const result = await packageImport(storage, repoPath, tempPath);
|
|
53
|
+
return sendSuccess(PackageImportResultType, {
|
|
54
|
+
name: result.name,
|
|
55
|
+
version: result.version,
|
|
56
|
+
packageHash: result.packageHash,
|
|
57
|
+
objectCount: BigInt(result.objectCount),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
return sendError(PackageImportResultType, errorToVariant(err));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Export a package as a zip archive.
|
|
70
|
+
*/
|
|
71
|
+
export async function exportPackage(storage, repoPath, name, version) {
|
|
72
|
+
try {
|
|
73
|
+
// Export to temp file
|
|
74
|
+
const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'e3-export-'));
|
|
75
|
+
const tempPath = path.join(tempDir, 'package.zip');
|
|
76
|
+
try {
|
|
77
|
+
await packageExport(storage, repoPath, name, version, tempPath);
|
|
78
|
+
const archive = await fs.readFile(tempPath);
|
|
79
|
+
return sendSuccess(BlobType, new Uint8Array(archive));
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
return sendError(BlobType, errorToVariant(err));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Delete a package.
|
|
91
|
+
*/
|
|
92
|
+
export async function deletePackage(storage, repoPath, name, version) {
|
|
93
|
+
try {
|
|
94
|
+
await packageRemove(storage, repoPath, name, version);
|
|
95
|
+
return sendSuccess(NullType, null);
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
return sendError(NullType, errorToVariant(err));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=packages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packages.js","sourceRoot":"","sources":["../../../src/handlers/packages.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EACL,WAAW,EACX,aAAa,EACb,aAAa,EACb,aAAa,EACb,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAE3E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAuB,EACvB,QAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACpC,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC,CAAC,CAAC;QACJ,OAAO,WAAW,CAAC,SAAS,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,OAAuB,EACvB,QAAgB,EAChB,IAAY,EACZ,OAAe;IAEf,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAChE,OAAO,WAAW,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,SAAS,CAAC,iBAAiB,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAuB,EACvB,QAAgB,EAChB,OAAmB;IAEnB,IAAI,CAAC;QACH,qBAAqB;QACrB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAChE,OAAO,WAAW,CAAC,uBAAuB,EAAE;gBAC1C,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC;aACxC,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,SAAS,CAAC,uBAAuB,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAuB,EACvB,QAAgB,EAChB,IAAY,EACZ,OAAe;IAEf,IAAI,CAAC;QACH,sBAAsB;QACtB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YAChE,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC5C,OAAO,WAAW,CAAC,QAAQ,EAAE,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;QACxD,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,SAAS,CAAC,QAAQ,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAuB,EACvB,QAAgB,EAChB,IAAY,EACZ,OAAe;IAEf,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACtD,OAAO,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,SAAS,CAAC,QAAQ,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* List available repositories in the repos directory.
|
|
7
|
+
*
|
|
8
|
+
* Scans the directory for subdirectories that are valid e3 repositories.
|
|
9
|
+
*/
|
|
10
|
+
export declare function listRepos(reposDir: string): Promise<Response>;
|
|
11
|
+
//# sourceMappingURL=repos.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repos.d.ts","sourceRoot":"","sources":["../../../src/handlers/repos.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA6BH;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAkBnE"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'node:fs/promises';
|
|
6
|
+
import * as path from 'node:path';
|
|
7
|
+
import { ArrayType, StringType } from '@elaraai/east';
|
|
8
|
+
import { sendSuccess, sendError } from '../beast2.js';
|
|
9
|
+
import { errorToVariant } from '../errors.js';
|
|
10
|
+
/**
|
|
11
|
+
* Check if a directory is a valid e3 repository.
|
|
12
|
+
* A valid repository has objects, packages, executions, and workspaces subdirectories.
|
|
13
|
+
*/
|
|
14
|
+
async function isValidRepository(repoPath) {
|
|
15
|
+
const requiredDirs = ['objects', 'packages', 'executions', 'workspaces'];
|
|
16
|
+
for (const dir of requiredDirs) {
|
|
17
|
+
try {
|
|
18
|
+
const stat = await fs.stat(path.join(repoPath, dir));
|
|
19
|
+
if (!stat.isDirectory()) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* List available repositories in the repos directory.
|
|
31
|
+
*
|
|
32
|
+
* Scans the directory for subdirectories that are valid e3 repositories.
|
|
33
|
+
*/
|
|
34
|
+
export async function listRepos(reposDir) {
|
|
35
|
+
try {
|
|
36
|
+
const entries = await fs.readdir(reposDir, { withFileTypes: true });
|
|
37
|
+
const repos = [];
|
|
38
|
+
for (const entry of entries) {
|
|
39
|
+
if (entry.isDirectory()) {
|
|
40
|
+
const repoPath = path.join(reposDir, entry.name);
|
|
41
|
+
if (await isValidRepository(repoPath)) {
|
|
42
|
+
repos.push(entry.name);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return sendSuccess(ArrayType(StringType), repos);
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
return sendError(ArrayType(StringType), errorToVariant(err));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=repos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repos.js","sourceRoot":"","sources":["../../../src/handlers/repos.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C;;;GAGG;AACH,KAAK,UAAU,iBAAiB,CAAC,QAAgB;IAC/C,MAAM,YAAY,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;IAEzE,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;YACrD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB;IAC9C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjD,IAAI,MAAM,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACtC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,WAAW,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import type { StorageBackend } from '@elaraai/e3-core';
|
|
6
|
+
/**
|
|
7
|
+
* Get repository status.
|
|
8
|
+
*/
|
|
9
|
+
export declare function getStatus(storage: StorageBackend, repoPath: string): Promise<Response>;
|
|
10
|
+
/**
|
|
11
|
+
* Start garbage collection (async).
|
|
12
|
+
*
|
|
13
|
+
* Returns immediately with an executionId. GC runs in background.
|
|
14
|
+
* Poll getGcStatus() for progress.
|
|
15
|
+
*/
|
|
16
|
+
export declare function startGc(storage: StorageBackend, repoPath: string, options: {
|
|
17
|
+
dryRun: boolean;
|
|
18
|
+
minAge?: number;
|
|
19
|
+
}): Response;
|
|
20
|
+
/**
|
|
21
|
+
* Get garbage collection status.
|
|
22
|
+
*/
|
|
23
|
+
export declare function getGcStatus(executionId: string): Response;
|
|
24
|
+
/**
|
|
25
|
+
* Start repository deletion (async).
|
|
26
|
+
*
|
|
27
|
+
* Returns immediately with an executionId. Deletion runs in background.
|
|
28
|
+
* Poll getRepoDeleteStatus() for completion.
|
|
29
|
+
*/
|
|
30
|
+
export declare function startRepoDelete(repoPath: string): Response;
|
|
31
|
+
/**
|
|
32
|
+
* Get repository deletion status.
|
|
33
|
+
*/
|
|
34
|
+
export declare function getRepoDeleteStatus(executionId: string): Response;
|
|
35
|
+
//# sourceMappingURL=repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/handlers/repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAgBvD;;GAEG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,QAAQ,CAAC,CA+BnB;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CACrB,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5C,QAAQ,CAuBV;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,CAezD;AAgBD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAmB1D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,CAejE"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'node:fs/promises';
|
|
6
|
+
import * as path from 'node:path';
|
|
7
|
+
import { variant } from '@elaraai/east';
|
|
8
|
+
import { repoGc, packageList, workspaceList } from '@elaraai/e3-core';
|
|
9
|
+
import { sendSuccess, sendSuccessWithStatus, sendError } from '../beast2.js';
|
|
10
|
+
import { errorToVariant } from '../errors.js';
|
|
11
|
+
import { RepositoryStatusType, GcStartResultType, GcStatusResultType, } from '../types.js';
|
|
12
|
+
import { createGcOperation, completeGcOperation, failGcOperation, getGcOperationStatus, hasGcOperation, } from '../async-operation-state.js';
|
|
13
|
+
/**
|
|
14
|
+
* Get repository status.
|
|
15
|
+
*/
|
|
16
|
+
export async function getStatus(storage, repoPath) {
|
|
17
|
+
try {
|
|
18
|
+
// Count objects
|
|
19
|
+
const objectsDir = path.join(repoPath, 'objects');
|
|
20
|
+
let objectCount = 0;
|
|
21
|
+
try {
|
|
22
|
+
const subdirs = await fs.readdir(objectsDir);
|
|
23
|
+
for (const subdir of subdirs) {
|
|
24
|
+
if (subdir.length === 2) {
|
|
25
|
+
const files = await fs.readdir(path.join(objectsDir, subdir));
|
|
26
|
+
objectCount += files.length;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// objects dir doesn't exist
|
|
32
|
+
}
|
|
33
|
+
// Count packages and workspaces
|
|
34
|
+
const packages = await packageList(storage, repoPath);
|
|
35
|
+
const workspaces = await workspaceList(storage, repoPath);
|
|
36
|
+
const status = {
|
|
37
|
+
path: repoPath,
|
|
38
|
+
objectCount: BigInt(objectCount),
|
|
39
|
+
packageCount: BigInt(packages.length),
|
|
40
|
+
workspaceCount: BigInt(workspaces.length),
|
|
41
|
+
};
|
|
42
|
+
return sendSuccess(RepositoryStatusType, status);
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
return sendError(RepositoryStatusType, errorToVariant(err));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Start garbage collection (async).
|
|
50
|
+
*
|
|
51
|
+
* Returns immediately with an executionId. GC runs in background.
|
|
52
|
+
* Poll getGcStatus() for progress.
|
|
53
|
+
*/
|
|
54
|
+
export function startGc(storage, repoPath, options) {
|
|
55
|
+
// Create operation and get executionId
|
|
56
|
+
const executionId = createGcOperation();
|
|
57
|
+
// Run GC in background (don't await)
|
|
58
|
+
void (async () => {
|
|
59
|
+
try {
|
|
60
|
+
const result = await repoGc(storage, repoPath, options);
|
|
61
|
+
completeGcOperation(executionId, {
|
|
62
|
+
deletedObjects: BigInt(result.deletedObjects),
|
|
63
|
+
deletedPartials: BigInt(result.deletedPartials),
|
|
64
|
+
retainedObjects: BigInt(result.retainedObjects),
|
|
65
|
+
skippedYoung: BigInt(result.skippedYoung),
|
|
66
|
+
bytesFreed: BigInt(result.bytesFreed),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
71
|
+
failGcOperation(executionId, message);
|
|
72
|
+
}
|
|
73
|
+
})();
|
|
74
|
+
// Return 202 Accepted with executionId
|
|
75
|
+
return sendSuccessWithStatus(GcStartResultType, { executionId }, 202);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get garbage collection status.
|
|
79
|
+
*/
|
|
80
|
+
export function getGcStatus(executionId) {
|
|
81
|
+
if (!hasGcOperation(executionId)) {
|
|
82
|
+
return sendError(GcStatusResultType, variant('internal', {
|
|
83
|
+
message: `GC operation not found: ${executionId}`,
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
const status = getGcOperationStatus(executionId);
|
|
87
|
+
if (!status) {
|
|
88
|
+
return sendError(GcStatusResultType, variant('internal', {
|
|
89
|
+
message: `GC operation not found: ${executionId}`,
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
return sendSuccess(GcStatusResultType, status);
|
|
93
|
+
}
|
|
94
|
+
// =============================================================================
|
|
95
|
+
// Repo Deletion (Async)
|
|
96
|
+
// =============================================================================
|
|
97
|
+
import { rmSync } from 'node:fs';
|
|
98
|
+
import { createRepoDeleteOperation, completeRepoDeleteOperation, failRepoDeleteOperation, getRepoDeleteOperationStatus, hasRepoDeleteOperation, } from '../async-operation-state.js';
|
|
99
|
+
import { RepoDeleteStartResultType, RepoDeleteStatusResultType } from '../types.js';
|
|
100
|
+
/**
|
|
101
|
+
* Start repository deletion (async).
|
|
102
|
+
*
|
|
103
|
+
* Returns immediately with an executionId. Deletion runs in background.
|
|
104
|
+
* Poll getRepoDeleteStatus() for completion.
|
|
105
|
+
*/
|
|
106
|
+
export function startRepoDelete(repoPath) {
|
|
107
|
+
// Create operation and get executionId
|
|
108
|
+
const executionId = createRepoDeleteOperation();
|
|
109
|
+
// Run deletion in background (don't await)
|
|
110
|
+
void (async () => {
|
|
111
|
+
try {
|
|
112
|
+
// Small delay to ensure 202 response is sent first
|
|
113
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
114
|
+
rmSync(repoPath, { recursive: true, force: true });
|
|
115
|
+
completeRepoDeleteOperation(executionId);
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
119
|
+
failRepoDeleteOperation(executionId, message);
|
|
120
|
+
}
|
|
121
|
+
})();
|
|
122
|
+
// Return 202 Accepted with executionId
|
|
123
|
+
return sendSuccessWithStatus(RepoDeleteStartResultType, { executionId }, 202);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get repository deletion status.
|
|
127
|
+
*/
|
|
128
|
+
export function getRepoDeleteStatus(executionId) {
|
|
129
|
+
if (!hasRepoDeleteOperation(executionId)) {
|
|
130
|
+
return sendError(RepoDeleteStatusResultType, variant('internal', {
|
|
131
|
+
message: `Repo delete operation not found: ${executionId}`,
|
|
132
|
+
}));
|
|
133
|
+
}
|
|
134
|
+
const status = getRepoDeleteOperationStatus(executionId);
|
|
135
|
+
if (!status) {
|
|
136
|
+
return sendError(RepoDeleteStatusResultType, variant('internal', {
|
|
137
|
+
message: `Repo delete operation not found: ${executionId}`,
|
|
138
|
+
}));
|
|
139
|
+
}
|
|
140
|
+
return sendSuccess(RepoDeleteStatusResultType, status);
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/handlers/repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import type { StorageBackend } from '@elaraai/e3-core';
|
|
6
|
+
/**
|
|
7
|
+
* List all tasks in a workspace.
|
|
8
|
+
*/
|
|
9
|
+
export declare function listTasks(storage: StorageBackend, repoPath: string, workspace: string): Promise<Response>;
|
|
10
|
+
/**
|
|
11
|
+
* Get task details.
|
|
12
|
+
*/
|
|
13
|
+
export declare function getTask(storage: StorageBackend, repoPath: string, workspace: string, taskName: string): Promise<Response>;
|
|
14
|
+
/**
|
|
15
|
+
* List execution history for a task.
|
|
16
|
+
*/
|
|
17
|
+
export declare function listExecutions(storage: StorageBackend, repoPath: string, workspace: string, taskName: string): Promise<Response>;
|
|
18
|
+
//# sourceMappingURL=tasks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../../src/handlers/tasks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAKvD;;GAEG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,CAAC,CAgBnB;AAED;;GAEG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,QAAQ,CAAC,CAenB;AAyBD;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,QAAQ,CAAC,CA+DnB"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import { ArrayType, none, some, variant } from '@elaraai/east';
|
|
6
|
+
import { workspaceListTasks, workspaceGetTask, workspaceGetTaskHash, executionListForTask, executionGet, } from '@elaraai/e3-core';
|
|
7
|
+
import { sendSuccess, sendError } from '../beast2.js';
|
|
8
|
+
import { errorToVariant } from '../errors.js';
|
|
9
|
+
import { TaskInfoType, TaskDetailsType, ExecutionListItemType } from '../types.js';
|
|
10
|
+
/**
|
|
11
|
+
* List all tasks in a workspace.
|
|
12
|
+
*/
|
|
13
|
+
export async function listTasks(storage, repoPath, workspace) {
|
|
14
|
+
try {
|
|
15
|
+
const taskNames = await workspaceListTasks(storage, repoPath, workspace);
|
|
16
|
+
// Get hash for each task
|
|
17
|
+
const result = await Promise.all(taskNames.map(async (name) => {
|
|
18
|
+
const hash = await workspaceGetTaskHash(storage, repoPath, workspace, name);
|
|
19
|
+
return { name, hash };
|
|
20
|
+
}));
|
|
21
|
+
return sendSuccess(ArrayType(TaskInfoType), result);
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
return sendError(ArrayType(TaskInfoType), errorToVariant(err));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get task details.
|
|
29
|
+
*/
|
|
30
|
+
export async function getTask(storage, repoPath, workspace, taskName) {
|
|
31
|
+
try {
|
|
32
|
+
const hash = await workspaceGetTaskHash(storage, repoPath, workspace, taskName);
|
|
33
|
+
const task = await workspaceGetTask(storage, repoPath, workspace, taskName);
|
|
34
|
+
return sendSuccess(TaskDetailsType, {
|
|
35
|
+
name: taskName,
|
|
36
|
+
hash,
|
|
37
|
+
commandIr: task.commandIr,
|
|
38
|
+
inputs: task.inputs,
|
|
39
|
+
output: task.output,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
return sendError(TaskDetailsType, errorToVariant(err));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Convert ExecutionStatus to API ExecutionHistoryStatus variant.
|
|
48
|
+
*/
|
|
49
|
+
function statusToApiStatus(status) {
|
|
50
|
+
switch (status.type) {
|
|
51
|
+
case 'running':
|
|
52
|
+
return variant('running', null);
|
|
53
|
+
case 'success':
|
|
54
|
+
return variant('success', null);
|
|
55
|
+
case 'failed':
|
|
56
|
+
return variant('failed', null);
|
|
57
|
+
case 'error':
|
|
58
|
+
return variant('error', null);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Calculate duration in milliseconds between two dates.
|
|
63
|
+
*/
|
|
64
|
+
function calculateDuration(startedAt, completedAt) {
|
|
65
|
+
return BigInt(Math.round(completedAt.getTime() - startedAt.getTime()));
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* List execution history for a task.
|
|
69
|
+
*/
|
|
70
|
+
export async function listExecutions(storage, repoPath, workspace, taskName) {
|
|
71
|
+
try {
|
|
72
|
+
const taskHash = await workspaceGetTaskHash(storage, repoPath, workspace, taskName);
|
|
73
|
+
const inputsHashes = await executionListForTask(storage, repoPath, taskHash);
|
|
74
|
+
const result = [];
|
|
75
|
+
for (const inputsHash of inputsHashes) {
|
|
76
|
+
const status = await executionGet(storage, repoPath, taskHash, inputsHash);
|
|
77
|
+
if (!status)
|
|
78
|
+
continue;
|
|
79
|
+
// Build the complete item based on status type
|
|
80
|
+
let item;
|
|
81
|
+
if (status.type === 'success') {
|
|
82
|
+
item = {
|
|
83
|
+
inputsHash,
|
|
84
|
+
inputHashes: status.value.inputHashes,
|
|
85
|
+
status: statusToApiStatus(status),
|
|
86
|
+
startedAt: status.value.startedAt.toISOString(),
|
|
87
|
+
completedAt: some(status.value.completedAt.toISOString()),
|
|
88
|
+
duration: some(calculateDuration(status.value.startedAt, status.value.completedAt)),
|
|
89
|
+
exitCode: none,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
else if (status.type === 'failed') {
|
|
93
|
+
item = {
|
|
94
|
+
inputsHash,
|
|
95
|
+
inputHashes: status.value.inputHashes,
|
|
96
|
+
status: statusToApiStatus(status),
|
|
97
|
+
startedAt: status.value.startedAt.toISOString(),
|
|
98
|
+
completedAt: some(status.value.completedAt.toISOString()),
|
|
99
|
+
duration: some(calculateDuration(status.value.startedAt, status.value.completedAt)),
|
|
100
|
+
exitCode: some(status.value.exitCode),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
else if (status.type === 'error') {
|
|
104
|
+
item = {
|
|
105
|
+
inputsHash,
|
|
106
|
+
inputHashes: status.value.inputHashes,
|
|
107
|
+
status: statusToApiStatus(status),
|
|
108
|
+
startedAt: status.value.startedAt.toISOString(),
|
|
109
|
+
completedAt: some(status.value.completedAt.toISOString()),
|
|
110
|
+
duration: none,
|
|
111
|
+
exitCode: none,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
// running status
|
|
116
|
+
item = {
|
|
117
|
+
inputsHash,
|
|
118
|
+
inputHashes: status.value.inputHashes,
|
|
119
|
+
status: statusToApiStatus(status),
|
|
120
|
+
startedAt: status.value.startedAt.toISOString(),
|
|
121
|
+
completedAt: none,
|
|
122
|
+
duration: none,
|
|
123
|
+
exitCode: none,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
result.push(item);
|
|
127
|
+
}
|
|
128
|
+
return sendSuccess(ArrayType(ExecutionListItemType), result);
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
return sendError(ArrayType(ExecutionListItemType), errorToVariant(err));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../../src/handlers/tasks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import type { StorageBackend } from '@elaraai/e3-core';
|
|
6
|
+
/**
|
|
7
|
+
* List all workspaces in the repository.
|
|
8
|
+
*/
|
|
9
|
+
export declare function listWorkspaces(storage: StorageBackend, repoPath: string): Promise<Response>;
|
|
10
|
+
/**
|
|
11
|
+
* Create a new workspace.
|
|
12
|
+
*/
|
|
13
|
+
export declare function createWorkspace(storage: StorageBackend, repoPath: string, name: string): Promise<Response>;
|
|
14
|
+
/**
|
|
15
|
+
* Get workspace state.
|
|
16
|
+
*/
|
|
17
|
+
export declare function getWorkspace(storage: StorageBackend, repoPath: string, name: string): Promise<Response>;
|
|
18
|
+
/**
|
|
19
|
+
* Get comprehensive workspace status.
|
|
20
|
+
*/
|
|
21
|
+
export declare function getWorkspaceStatus(storage: StorageBackend, repoPath: string, name: string): Promise<Response>;
|
|
22
|
+
/**
|
|
23
|
+
* Delete a workspace.
|
|
24
|
+
*/
|
|
25
|
+
export declare function deleteWorkspace(storage: StorageBackend, repoPath: string, name: string): Promise<Response>;
|
|
26
|
+
/**
|
|
27
|
+
* Deploy a package to a workspace.
|
|
28
|
+
*/
|
|
29
|
+
export declare function deployWorkspace(storage: StorageBackend, repoPath: string, workspace: string, packageRef: string): Promise<Response>;
|
|
30
|
+
/**
|
|
31
|
+
* Export a workspace as a zip archive.
|
|
32
|
+
*/
|
|
33
|
+
export declare function exportWorkspace(storage: StorageBackend, repoPath: string, workspace: string): Promise<Response>;
|
|
34
|
+
//# sourceMappingURL=workspaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaces.d.ts","sourceRoot":"","sources":["../../../src/handlers/workspaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkBH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAKvD;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,QAAQ,CAAC,CA2BnB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,CAAC,CAYnB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,CAAC,CAUnB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,CAAC,CAkDnB;AA8CD;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,CAAC,CAOnB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,QAAQ,CAAC,CAanB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,CAAC,CAenB"}
|