@elaraai/e3-api-server 0.0.2-beta.11 → 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 +16 -4
package/dist/src/beast2.js
CHANGED
|
@@ -5,23 +5,33 @@
|
|
|
5
5
|
import { encodeBeast2For, decodeBeast2For, variant } from '@elaraai/east';
|
|
6
6
|
import { ResponseType } from './types.js';
|
|
7
7
|
/**
|
|
8
|
-
* Decode BEAST2 request body.
|
|
8
|
+
* Decode BEAST2 request body from Hono context.
|
|
9
9
|
*/
|
|
10
10
|
export async function decodeBody(c, type) {
|
|
11
11
|
const contentType = c.req.header('content-type');
|
|
12
12
|
if (contentType !== 'application/beast2') {
|
|
13
13
|
throw new Error(`Expected Content-Type: application/beast2, got ${contentType}`);
|
|
14
14
|
}
|
|
15
|
+
// TODO should we use use streaming decoder here?
|
|
15
16
|
const buffer = await c.req.arrayBuffer();
|
|
16
17
|
const decode = decodeBeast2For(type);
|
|
17
18
|
return decode(new Uint8Array(buffer));
|
|
18
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Decode raw BEAST2 bytes (for handlers that receive body directly).
|
|
22
|
+
*/
|
|
23
|
+
export function decodeBeast2(data, type) {
|
|
24
|
+
const decode = decodeBeast2For(type);
|
|
25
|
+
return decode(data);
|
|
26
|
+
}
|
|
19
27
|
/**
|
|
20
28
|
* Send BEAST2 success response.
|
|
29
|
+
*
|
|
30
|
+
* Returns a web Response object that can be used by both Hono routes and Lambda handlers.
|
|
21
31
|
*/
|
|
22
|
-
export function sendSuccess(
|
|
32
|
+
export function sendSuccess(type, value) {
|
|
23
33
|
const responseType = ResponseType(type);
|
|
24
|
-
const encode = encodeBeast2For(responseType);
|
|
34
|
+
const encode = encodeBeast2For(responseType); // TODO should we use streaming encoder here?
|
|
25
35
|
const body = encode(variant('success', value));
|
|
26
36
|
return new Response(body, {
|
|
27
37
|
status: 200,
|
|
@@ -32,8 +42,10 @@ export function sendSuccess(c, type, value) {
|
|
|
32
42
|
}
|
|
33
43
|
/**
|
|
34
44
|
* Send BEAST2 error response.
|
|
45
|
+
*
|
|
46
|
+
* Returns a web Response object that can be used by both Hono routes and Lambda handlers.
|
|
35
47
|
*/
|
|
36
|
-
export function sendError(
|
|
48
|
+
export function sendError(type, error) {
|
|
37
49
|
const responseType = ResponseType(type);
|
|
38
50
|
const encode = encodeBeast2For(responseType);
|
|
39
51
|
const body = encode(variant('error', error));
|
|
@@ -44,4 +56,18 @@ export function sendError(c, type, error) {
|
|
|
44
56
|
},
|
|
45
57
|
});
|
|
46
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Send BEAST2 success response with custom HTTP status.
|
|
61
|
+
*/
|
|
62
|
+
export function sendSuccessWithStatus(type, value, status) {
|
|
63
|
+
const responseType = ResponseType(type);
|
|
64
|
+
const encode = encodeBeast2For(responseType); // TODO should we use streaming encoder here?
|
|
65
|
+
const body = encode(variant('success', value));
|
|
66
|
+
return new Response(body, {
|
|
67
|
+
status,
|
|
68
|
+
headers: {
|
|
69
|
+
'Content-Type': 'application/beast2',
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
}
|
|
47
73
|
//# sourceMappingURL=beast2.js.map
|
package/dist/src/beast2.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"beast2.js","sourceRoot":"","sources":["../../src/beast2.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG1E,OAAO,EAAE,YAAY,EAAc,MAAM,YAAY,CAAC;AAEtD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,CAAU,EACV,IAAO;IAEP,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACjD,IAAI,WAAW,KAAK,oBAAoB,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,kDAAkD,WAAW,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,MAAM,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"beast2.js","sourceRoot":"","sources":["../../src/beast2.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG1E,OAAO,EAAE,YAAY,EAAc,MAAM,YAAY,CAAC;AAEtD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,CAAU,EACV,IAAO;IAEP,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACjD,IAAI,WAAW,KAAK,oBAAoB,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,kDAAkD,WAAW,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,iDAAiD;IACjD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,MAAM,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAgB,EAChB,IAAO;IAEP,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,IAAO,EACP,KAAqB;IAErB,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,6CAA6C;IAC3F,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAqC,CAAC,CAAC;IAEnF,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;QACxB,MAAM,EAAE,GAAG;QACX,OAAO,EAAE;YACP,cAAc,EAAE,oBAAoB;SACrC;KACF,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CACvB,IAAO,EACP,KAAY;IAEZ,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAqC,CAAC,CAAC;IAEjF,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;QACxB,MAAM,EAAE,GAAG;QACX,OAAO,EAAE;YACP,cAAc,EAAE,oBAAoB;SACrC;KACF,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAO,EACP,KAAqB,EACrB,MAAc;IAEd,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,6CAA6C;IAC3F,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAqC,CAAC,CAAC;IAEnF,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;QACxB,MAAM;QACN,OAAO,EAAE;YACP,cAAc,EAAE,oBAAoB;SACrC;KACF,CAAC,CAAC;AACL,CAAC"}
|
package/dist/src/cli.js
CHANGED
|
@@ -10,17 +10,69 @@ program
|
|
|
10
10
|
.name('e3-api-server')
|
|
11
11
|
.description('HTTP server for e3 repositories')
|
|
12
12
|
.version('0.0.1-beta.0')
|
|
13
|
-
.
|
|
13
|
+
.option('--repos <dir>', 'Directory containing e3 repositories (multi-repo mode)')
|
|
14
|
+
.option('--repo <path>', 'Path to a single repository (single-repo mode, access via /repos/default)')
|
|
14
15
|
.option('-p, --port <port>', 'HTTP port', '3000')
|
|
15
16
|
.option('-H, --host <host>', 'Bind address', 'localhost')
|
|
16
|
-
.
|
|
17
|
+
.option('--cors', 'Enable CORS')
|
|
18
|
+
.option('--oidc', 'Enable built-in OIDC authentication provider')
|
|
19
|
+
.option('--token-expiry <duration>', 'Access token expiry (e.g., "5s", "15m", "1h")', '1h')
|
|
20
|
+
.option('--refresh-token-expiry <duration>', 'Refresh token expiry (e.g., "1h", "7d", "90d")', '90d')
|
|
21
|
+
.option('--auth-key <path>', 'JWT public key path (external auth)')
|
|
22
|
+
.option('--auth-issuer <iss>', 'Expected JWT issuer (external auth)')
|
|
23
|
+
.option('--auth-audience <aud>', 'Expected JWT audience (external auth)')
|
|
24
|
+
.action(async (options) => {
|
|
25
|
+
// Validate mutually exclusive options
|
|
26
|
+
if (options.repos && options.repo) {
|
|
27
|
+
console.error('Error: Cannot specify both --repos and --repo');
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
if (!options.repos && !options.repo) {
|
|
31
|
+
console.error('Error: Must specify either --repos or --repo');
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
const port = parseInt(options.port, 10);
|
|
35
|
+
const host = options.host;
|
|
36
|
+
// Build auth config if all auth options provided (external provider)
|
|
37
|
+
const auth = options.authKey && options.authIssuer && options.authAudience
|
|
38
|
+
? {
|
|
39
|
+
publicKeyPath: options.authKey,
|
|
40
|
+
issuer: options.authIssuer,
|
|
41
|
+
audience: options.authAudience,
|
|
42
|
+
}
|
|
43
|
+
: undefined;
|
|
44
|
+
// Build OIDC config if enabled (built-in provider)
|
|
45
|
+
const oidc = options.oidc
|
|
46
|
+
? {
|
|
47
|
+
baseUrl: `http://${host}:${port}`,
|
|
48
|
+
tokenExpiry: options.tokenExpiry,
|
|
49
|
+
refreshTokenExpiry: options.refreshTokenExpiry,
|
|
50
|
+
}
|
|
51
|
+
: undefined;
|
|
17
52
|
const server = await createServer({
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
53
|
+
reposDir: options.repos,
|
|
54
|
+
singleRepoPath: options.repo,
|
|
55
|
+
port,
|
|
56
|
+
host,
|
|
57
|
+
cors: options.cors,
|
|
58
|
+
auth,
|
|
59
|
+
oidc,
|
|
21
60
|
});
|
|
22
61
|
await server.start();
|
|
23
|
-
console.log(`e3-api-server listening on http://${
|
|
62
|
+
console.log(`e3-api-server listening on http://${host}:${server.port}`);
|
|
63
|
+
if (options.repos) {
|
|
64
|
+
console.log(`Serving repositories from: ${options.repos}`);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
console.log(`Serving single repository from: ${options.repo}`);
|
|
68
|
+
console.log(`Access via: http://${host}:${server.port}/repos/default`);
|
|
69
|
+
}
|
|
70
|
+
if (oidc) {
|
|
71
|
+
console.log(`OIDC provider enabled (token expiry: ${options.tokenExpiry})`);
|
|
72
|
+
if (process.env.E3_AUTH_AUTO_APPROVE === '1') {
|
|
73
|
+
console.log(' Auto-approve mode enabled (E3_AUTH_AUTO_APPROVE=1)');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
24
76
|
// Handle shutdown signals
|
|
25
77
|
const shutdown = async () => {
|
|
26
78
|
console.log('\nShutting down...');
|
package/dist/src/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,eAAe,CAAC;KACrB,WAAW,CAAC,iCAAiC,CAAC;KAC9C,OAAO,CAAC,cAAc,CAAC;KACvB,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/src/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,KAAK,CAkElD"}
|
package/dist/src/errors.js
CHANGED
|
@@ -3,11 +3,14 @@
|
|
|
3
3
|
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
4
|
*/
|
|
5
5
|
import { variant, some, none } from '@elaraai/east';
|
|
6
|
-
import { WorkspaceNotFoundError, WorkspaceNotDeployedError, WorkspaceExistsError, WorkspaceLockError, PackageNotFoundError, PackageExistsError, PackageInvalidError, DatasetNotFoundError, TaskNotFoundError, ObjectNotFoundError, DataflowError, DataflowAbortedError, PermissionDeniedError, } from '@elaraai/e3-core';
|
|
6
|
+
import { RepositoryNotFoundError, WorkspaceNotFoundError, WorkspaceNotDeployedError, WorkspaceExistsError, WorkspaceLockError, PackageNotFoundError, PackageExistsError, PackageInvalidError, DatasetNotFoundError, TaskNotFoundError, ObjectNotFoundError, DataflowError, DataflowAbortedError, PermissionDeniedError, } from '@elaraai/e3-core';
|
|
7
7
|
/**
|
|
8
8
|
* Convert an e3-core error to an API error variant.
|
|
9
9
|
*/
|
|
10
10
|
export function errorToVariant(err) {
|
|
11
|
+
if (err instanceof RepositoryNotFoundError) {
|
|
12
|
+
return variant('repository_not_found', { repo: err.path });
|
|
13
|
+
}
|
|
11
14
|
if (err instanceof WorkspaceNotFoundError) {
|
|
12
15
|
return variant('workspace_not_found', { workspace: err.workspace });
|
|
13
16
|
}
|
|
@@ -20,7 +23,7 @@ export function errorToVariant(err) {
|
|
|
20
23
|
if (err instanceof WorkspaceLockError) {
|
|
21
24
|
return variant('workspace_locked', {
|
|
22
25
|
workspace: err.workspace,
|
|
23
|
-
holder: err.holder
|
|
26
|
+
holder: err.holder && err.holder.pid !== undefined
|
|
24
27
|
? variant('known', {
|
|
25
28
|
pid: BigInt(err.holder.pid),
|
|
26
29
|
acquiredAt: err.holder.acquiredAt,
|
package/dist/src/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAG1B;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,IAAI,GAAG,YAAY,sBAAsB,EAAE,CAAC;QAC1C,OAAO,OAAO,CAAC,qBAAqB,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,GAAG,YAAY,yBAAyB,EAAE,CAAC;QAC7C,OAAO,OAAO,CAAC,wBAAwB,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,GAAG,YAAY,oBAAoB,EAAE,CAAC;QACxC,OAAO,OAAO,CAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,GAAG,YAAY,kBAAkB,EAAE,CAAC;QACtC,OAAO,OAAO,CAAC,kBAAkB,EAAE;YACjC,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,MAAM,EAAE,GAAG,CAAC,MAAM;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import type { DataflowExecutionState, DataflowEvent } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Create a new execution state for a workspace.
|
|
8
|
+
* Replaces any existing state (retention: until next execution).
|
|
9
|
+
*/
|
|
10
|
+
export declare function createExecutionState(repoPath: string, workspace: string): void;
|
|
11
|
+
/**
|
|
12
|
+
* Add an event to the execution state.
|
|
13
|
+
*/
|
|
14
|
+
export declare function addExecutionEvent(repoPath: string, workspace: string, event: DataflowEvent): void;
|
|
15
|
+
/**
|
|
16
|
+
* Mark execution as completed with summary.
|
|
17
|
+
*/
|
|
18
|
+
export declare function completeExecution(repoPath: string, workspace: string, summary: {
|
|
19
|
+
executed: number;
|
|
20
|
+
cached: number;
|
|
21
|
+
failed: number;
|
|
22
|
+
skipped: number;
|
|
23
|
+
duration: number;
|
|
24
|
+
}, success: boolean): void;
|
|
25
|
+
/**
|
|
26
|
+
* Mark execution as aborted.
|
|
27
|
+
*/
|
|
28
|
+
export declare function abortExecution(repoPath: string, workspace: string): void;
|
|
29
|
+
/**
|
|
30
|
+
* Get execution state for a workspace.
|
|
31
|
+
* Returns null if no execution is tracked.
|
|
32
|
+
*
|
|
33
|
+
* @param offset - Skip first N events (default: 0)
|
|
34
|
+
* @param limit - Max events to return (default: all)
|
|
35
|
+
*/
|
|
36
|
+
export declare function getExecutionState(repoPath: string, workspace: string, options?: {
|
|
37
|
+
offset?: number;
|
|
38
|
+
limit?: number;
|
|
39
|
+
}): DataflowExecutionState | null;
|
|
40
|
+
/**
|
|
41
|
+
* Check if there's an active (running) execution for a workspace.
|
|
42
|
+
*/
|
|
43
|
+
export declare function hasActiveExecution(repoPath: string, workspace: string): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Clear execution state for a workspace.
|
|
46
|
+
* Useful for cleanup in tests.
|
|
47
|
+
*/
|
|
48
|
+
export declare function clearExecutionState(repoPath: string, workspace: string): void;
|
|
49
|
+
/**
|
|
50
|
+
* Clear all execution states.
|
|
51
|
+
* Useful for cleanup in tests.
|
|
52
|
+
*/
|
|
53
|
+
export declare function clearAllExecutionStates(): void;
|
|
54
|
+
//# sourceMappingURL=execution-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution-state.d.ts","sourceRoot":"","sources":["../../src/execution-state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,KAAK,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAwBxE;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAO9E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CAMjG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAChG,OAAO,EAAE,OAAO,GACf,IAAI,CAQN;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAOxE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAChD,sBAAsB,GAAG,IAAI,CA0D/B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAI/E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAG7E;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* In-memory execution state storage for dataflow polling.
|
|
7
|
+
*
|
|
8
|
+
* Tracks execution events for each workspace, allowing clients to poll
|
|
9
|
+
* for progress updates during long-running dataflow executions.
|
|
10
|
+
*
|
|
11
|
+
* Retention: State is retained until the next execution starts for that workspace.
|
|
12
|
+
*/
|
|
13
|
+
import { variant, some, none } from '@elaraai/east';
|
|
14
|
+
// Key format: `${repoPath}::${workspace}`
|
|
15
|
+
const executionStates = new Map();
|
|
16
|
+
function makeKey(repoPath, workspace) {
|
|
17
|
+
return `${repoPath}::${workspace}`;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create a new execution state for a workspace.
|
|
21
|
+
* Replaces any existing state (retention: until next execution).
|
|
22
|
+
*/
|
|
23
|
+
export function createExecutionState(repoPath, workspace) {
|
|
24
|
+
const key = makeKey(repoPath, workspace);
|
|
25
|
+
executionStates.set(key, {
|
|
26
|
+
status: 'running',
|
|
27
|
+
startedAt: new Date(),
|
|
28
|
+
events: [],
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Add an event to the execution state.
|
|
33
|
+
*/
|
|
34
|
+
export function addExecutionEvent(repoPath, workspace, event) {
|
|
35
|
+
const key = makeKey(repoPath, workspace);
|
|
36
|
+
const state = executionStates.get(key);
|
|
37
|
+
if (state) {
|
|
38
|
+
state.events.push(event);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Mark execution as completed with summary.
|
|
43
|
+
*/
|
|
44
|
+
export function completeExecution(repoPath, workspace, summary, success) {
|
|
45
|
+
const key = makeKey(repoPath, workspace);
|
|
46
|
+
const state = executionStates.get(key);
|
|
47
|
+
if (state) {
|
|
48
|
+
state.status = success ? 'completed' : 'failed';
|
|
49
|
+
state.completedAt = new Date();
|
|
50
|
+
state.summary = summary;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Mark execution as aborted.
|
|
55
|
+
*/
|
|
56
|
+
export function abortExecution(repoPath, workspace) {
|
|
57
|
+
const key = makeKey(repoPath, workspace);
|
|
58
|
+
const state = executionStates.get(key);
|
|
59
|
+
if (state) {
|
|
60
|
+
state.status = 'aborted';
|
|
61
|
+
state.completedAt = new Date();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get execution state for a workspace.
|
|
66
|
+
* Returns null if no execution is tracked.
|
|
67
|
+
*
|
|
68
|
+
* @param offset - Skip first N events (default: 0)
|
|
69
|
+
* @param limit - Max events to return (default: all)
|
|
70
|
+
*/
|
|
71
|
+
export function getExecutionState(repoPath, workspace, options = {}) {
|
|
72
|
+
const key = makeKey(repoPath, workspace);
|
|
73
|
+
const state = executionStates.get(key);
|
|
74
|
+
if (!state) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
const offset = options.offset ?? 0;
|
|
78
|
+
const limit = options.limit;
|
|
79
|
+
const totalEvents = state.events.length;
|
|
80
|
+
// Apply offset and limit to events
|
|
81
|
+
let events;
|
|
82
|
+
if (limit !== undefined) {
|
|
83
|
+
events = state.events.slice(offset, offset + limit);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
events = state.events.slice(offset);
|
|
87
|
+
}
|
|
88
|
+
// Convert status to East variant
|
|
89
|
+
let status;
|
|
90
|
+
switch (state.status) {
|
|
91
|
+
case 'running':
|
|
92
|
+
status = variant('running', null);
|
|
93
|
+
break;
|
|
94
|
+
case 'completed':
|
|
95
|
+
status = variant('completed', null);
|
|
96
|
+
break;
|
|
97
|
+
case 'failed':
|
|
98
|
+
status = variant('failed', null);
|
|
99
|
+
break;
|
|
100
|
+
case 'aborted':
|
|
101
|
+
status = variant('aborted', null);
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
// Convert summary to East option with BigInt values
|
|
105
|
+
let summary;
|
|
106
|
+
if (state.summary) {
|
|
107
|
+
summary = some({
|
|
108
|
+
executed: BigInt(state.summary.executed),
|
|
109
|
+
cached: BigInt(state.summary.cached),
|
|
110
|
+
failed: BigInt(state.summary.failed),
|
|
111
|
+
skipped: BigInt(state.summary.skipped),
|
|
112
|
+
duration: state.summary.duration,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
summary = none;
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
status,
|
|
120
|
+
startedAt: state.startedAt.toISOString(),
|
|
121
|
+
completedAt: state.completedAt ? some(state.completedAt.toISOString()) : none,
|
|
122
|
+
summary,
|
|
123
|
+
events,
|
|
124
|
+
totalEvents: BigInt(totalEvents),
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Check if there's an active (running) execution for a workspace.
|
|
129
|
+
*/
|
|
130
|
+
export function hasActiveExecution(repoPath, workspace) {
|
|
131
|
+
const key = makeKey(repoPath, workspace);
|
|
132
|
+
const state = executionStates.get(key);
|
|
133
|
+
return state?.status === 'running';
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Clear execution state for a workspace.
|
|
137
|
+
* Useful for cleanup in tests.
|
|
138
|
+
*/
|
|
139
|
+
export function clearExecutionState(repoPath, workspace) {
|
|
140
|
+
const key = makeKey(repoPath, workspace);
|
|
141
|
+
executionStates.delete(key);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Clear all execution states.
|
|
145
|
+
* Useful for cleanup in tests.
|
|
146
|
+
*/
|
|
147
|
+
export function clearAllExecutionStates() {
|
|
148
|
+
executionStates.clear();
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=execution-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution-state.js","sourceRoot":"","sources":["../../src/execution-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
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
|
+
* Start dataflow execution (non-blocking).
|
|
8
|
+
*
|
|
9
|
+
* Returns 202 Accepted immediately and runs execution in background.
|
|
10
|
+
* Creates execution state that can be polled via getDataflowExecution().
|
|
11
|
+
*/
|
|
12
|
+
export declare function startDataflow(storage: StorageBackend, repoPath: string, workspace: string, options: {
|
|
13
|
+
concurrency: number;
|
|
14
|
+
force: boolean;
|
|
15
|
+
filter?: string;
|
|
16
|
+
}): Promise<Response>;
|
|
17
|
+
/**
|
|
18
|
+
* Execute dataflow (blocking).
|
|
19
|
+
*
|
|
20
|
+
* Blocks until execution completes and returns the result.
|
|
21
|
+
*/
|
|
22
|
+
export declare function executeDataflow(storage: StorageBackend, repoPath: string, workspace: string, options: {
|
|
23
|
+
concurrency: number;
|
|
24
|
+
force: boolean;
|
|
25
|
+
filter?: string;
|
|
26
|
+
}): Promise<Response>;
|
|
27
|
+
/**
|
|
28
|
+
* Get workspace status (for polling).
|
|
29
|
+
*/
|
|
30
|
+
export declare function getDataflowStatus(storage: StorageBackend, repoPath: string, workspace: string): Promise<Response>;
|
|
31
|
+
/**
|
|
32
|
+
* Get dependency graph.
|
|
33
|
+
*/
|
|
34
|
+
export declare function getDataflowGraph(storage: StorageBackend, repoPath: string, workspace: string): Promise<Response>;
|
|
35
|
+
/**
|
|
36
|
+
* Get task logs.
|
|
37
|
+
*/
|
|
38
|
+
export declare function getTaskLogs(storage: StorageBackend, repoPath: string, workspace: string, taskName: string, stream: 'stdout' | 'stderr', offset: number, limit: number): Promise<Response>;
|
|
39
|
+
/**
|
|
40
|
+
* Get dataflow execution state (for polling).
|
|
41
|
+
*
|
|
42
|
+
* Returns the current execution state including events for progress tracking.
|
|
43
|
+
* Supports offset/limit for paginating events.
|
|
44
|
+
*/
|
|
45
|
+
export declare function getDataflowExecution(repoPath: string, workspace: string, options?: {
|
|
46
|
+
offset?: number;
|
|
47
|
+
limit?: number;
|
|
48
|
+
}): Response;
|
|
49
|
+
//# sourceMappingURL=dataflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataflow.d.ts","sourceRoot":"","sources":["../../../src/handlers/dataflow.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkBH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAgOvD;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAChE,OAAO,CAAC,QAAQ,CAAC,CA+EnB;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAChE,OAAO,CAAC,QAAQ,CAAC,CAOnB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,CAAC,CAOnB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,CAAC,CAenB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,QAAQ,GAAG,QAAQ,EAC3B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,QAAQ,CAAC,CAqBnB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAChD,QAAQ,CAUV"}
|