@elaraai/e3-api-server 0.0.1-alpha.2
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 +156 -0
- package/dist/src/beast2.d.ts +20 -0
- package/dist/src/beast2.d.ts.map +1 -0
- package/dist/src/beast2.js +47 -0
- package/dist/src/beast2.js.map +1 -0
- package/dist/src/cli.d.ts +7 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +34 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/errors.d.ts +10 -0
- package/dist/src/errors.d.ts.map +1 -0
- package/dist/src/errors.js +73 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/index.d.ts +13 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +13 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/routes/datasets.d.ts +7 -0
- package/dist/src/routes/datasets.d.ts.map +1 -0
- package/dist/src/routes/datasets.js +98 -0
- package/dist/src/routes/datasets.js.map +1 -0
- package/dist/src/routes/executions.d.ts +7 -0
- package/dist/src/routes/executions.d.ts.map +1 -0
- package/dist/src/routes/executions.js +303 -0
- package/dist/src/routes/executions.js.map +1 -0
- package/dist/src/routes/packages.d.ts +7 -0
- package/dist/src/routes/packages.d.ts.map +1 -0
- package/dist/src/routes/packages.js +124 -0
- package/dist/src/routes/packages.js.map +1 -0
- package/dist/src/routes/repository.d.ts +7 -0
- package/dist/src/routes/repository.d.ts.map +1 -0
- package/dist/src/routes/repository.js +67 -0
- package/dist/src/routes/repository.js.map +1 -0
- package/dist/src/routes/tasks.d.ts +7 -0
- package/dist/src/routes/tasks.d.ts.map +1 -0
- package/dist/src/routes/tasks.js +58 -0
- package/dist/src/routes/tasks.js.map +1 -0
- package/dist/src/routes/workspaces.d.ts +7 -0
- package/dist/src/routes/workspaces.d.ts.map +1 -0
- package/dist/src/routes/workspaces.js +133 -0
- package/dist/src/routes/workspaces.js.map +1 -0
- package/dist/src/server.d.ts +37 -0
- package/dist/src/server.d.ts.map +1 -0
- package/dist/src/server.js +83 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/types.d.ts +1310 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +471 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils.d.ts +25 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/src/utils.js +27 -0
- package/dist/src/utils.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import { Hono } from 'hono';
|
|
6
|
+
import { NullType, some, none, variant } from '@elaraai/east';
|
|
7
|
+
import { dataflowStart, dataflowExecute, dataflowGetGraph, workspaceStatus, workspaceGetTaskHash, workspaceGetTask, workspaceGetDatasetHash, executionListForTask, executionReadLog, inputsHash, acquireWorkspaceLock, } from '@elaraai/e3-core';
|
|
8
|
+
import { decodeBody, sendSuccess, sendError } from '../beast2.js';
|
|
9
|
+
import { errorToVariant } from '../errors.js';
|
|
10
|
+
import { DataflowRequestType, WorkspaceStatusResultType, DataflowGraphType, LogChunkType, DataflowResultType, } from '../types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Convert core DatasetStatusInfo to API type.
|
|
13
|
+
*/
|
|
14
|
+
function convertDatasetStatus(info) {
|
|
15
|
+
let status;
|
|
16
|
+
switch (info.status.type) {
|
|
17
|
+
case 'unset':
|
|
18
|
+
status = variant('unset', null);
|
|
19
|
+
break;
|
|
20
|
+
case 'stale':
|
|
21
|
+
status = variant('stale', null);
|
|
22
|
+
break;
|
|
23
|
+
case 'up-to-date':
|
|
24
|
+
status = variant('up-to-date', null);
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
path: info.path,
|
|
29
|
+
status,
|
|
30
|
+
hash: info.hash ? some(info.hash) : none,
|
|
31
|
+
isTaskOutput: info.isTaskOutput,
|
|
32
|
+
producedBy: info.producedBy ? some(info.producedBy) : none,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Convert core TaskStatusInfo to API type.
|
|
37
|
+
*/
|
|
38
|
+
function convertTaskStatus(info) {
|
|
39
|
+
let status;
|
|
40
|
+
switch (info.status.type) {
|
|
41
|
+
case 'up-to-date':
|
|
42
|
+
status = variant('up-to-date', { cached: info.status.cached });
|
|
43
|
+
break;
|
|
44
|
+
case 'ready':
|
|
45
|
+
status = variant('ready', null);
|
|
46
|
+
break;
|
|
47
|
+
case 'waiting':
|
|
48
|
+
status = variant('waiting', { reason: info.status.reason });
|
|
49
|
+
break;
|
|
50
|
+
case 'in-progress':
|
|
51
|
+
status = variant('in-progress', {
|
|
52
|
+
pid: info.status.pid != null ? some(BigInt(info.status.pid)) : none,
|
|
53
|
+
startedAt: info.status.startedAt ? some(info.status.startedAt) : none,
|
|
54
|
+
});
|
|
55
|
+
break;
|
|
56
|
+
case 'failed':
|
|
57
|
+
status = variant('failed', {
|
|
58
|
+
exitCode: BigInt(info.status.exitCode),
|
|
59
|
+
completedAt: info.status.completedAt ? some(info.status.completedAt) : none,
|
|
60
|
+
});
|
|
61
|
+
break;
|
|
62
|
+
case 'error':
|
|
63
|
+
status = variant('error', {
|
|
64
|
+
message: info.status.message,
|
|
65
|
+
completedAt: info.status.completedAt ? some(info.status.completedAt) : none,
|
|
66
|
+
});
|
|
67
|
+
break;
|
|
68
|
+
case 'stale-running':
|
|
69
|
+
status = variant('stale-running', {
|
|
70
|
+
pid: info.status.pid != null ? some(BigInt(info.status.pid)) : none,
|
|
71
|
+
startedAt: info.status.startedAt ? some(info.status.startedAt) : none,
|
|
72
|
+
});
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
name: info.name,
|
|
77
|
+
hash: info.hash,
|
|
78
|
+
status,
|
|
79
|
+
inputs: info.inputs,
|
|
80
|
+
output: info.output,
|
|
81
|
+
dependsOn: info.dependsOn,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Convert core TaskExecutionResult to API type.
|
|
86
|
+
*/
|
|
87
|
+
function convertTaskExecutionResult(result) {
|
|
88
|
+
let state;
|
|
89
|
+
switch (result.state) {
|
|
90
|
+
case 'success':
|
|
91
|
+
state = variant('success', null);
|
|
92
|
+
break;
|
|
93
|
+
case 'failed':
|
|
94
|
+
state = variant('failed', { exitCode: BigInt(result.exitCode ?? -1) });
|
|
95
|
+
break;
|
|
96
|
+
case 'error':
|
|
97
|
+
state = variant('error', { message: result.error ?? 'Unknown error' });
|
|
98
|
+
break;
|
|
99
|
+
case 'skipped':
|
|
100
|
+
state = variant('skipped', null);
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
name: result.name,
|
|
105
|
+
cached: result.cached,
|
|
106
|
+
state,
|
|
107
|
+
duration: result.duration,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Convert core DataflowResult to API type.
|
|
112
|
+
*/
|
|
113
|
+
function convertDataflowResult(result) {
|
|
114
|
+
return {
|
|
115
|
+
success: result.success,
|
|
116
|
+
executed: BigInt(result.executed),
|
|
117
|
+
cached: BigInt(result.cached),
|
|
118
|
+
failed: BigInt(result.failed),
|
|
119
|
+
skipped: BigInt(result.skipped),
|
|
120
|
+
tasks: result.tasks.map(convertTaskExecutionResult),
|
|
121
|
+
duration: result.duration,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Convert core WorkspaceStatusResult to API type.
|
|
126
|
+
*/
|
|
127
|
+
function convertWorkspaceStatus(result) {
|
|
128
|
+
return {
|
|
129
|
+
workspace: result.workspace,
|
|
130
|
+
lock: result.lock
|
|
131
|
+
? some({
|
|
132
|
+
pid: BigInt(result.lock.pid),
|
|
133
|
+
acquiredAt: result.lock.acquiredAt,
|
|
134
|
+
bootId: result.lock.bootId ? some(result.lock.bootId) : none,
|
|
135
|
+
command: result.lock.command ? some(result.lock.command) : none,
|
|
136
|
+
})
|
|
137
|
+
: none,
|
|
138
|
+
datasets: result.datasets.map(convertDatasetStatus),
|
|
139
|
+
tasks: result.tasks.map(convertTaskStatus),
|
|
140
|
+
summary: {
|
|
141
|
+
datasets: {
|
|
142
|
+
total: BigInt(result.summary.datasets.total),
|
|
143
|
+
unset: BigInt(result.summary.datasets.unset),
|
|
144
|
+
stale: BigInt(result.summary.datasets.stale),
|
|
145
|
+
upToDate: BigInt(result.summary.datasets.upToDate),
|
|
146
|
+
},
|
|
147
|
+
tasks: {
|
|
148
|
+
total: BigInt(result.summary.tasks.total),
|
|
149
|
+
upToDate: BigInt(result.summary.tasks.upToDate),
|
|
150
|
+
ready: BigInt(result.summary.tasks.ready),
|
|
151
|
+
waiting: BigInt(result.summary.tasks.waiting),
|
|
152
|
+
inProgress: BigInt(result.summary.tasks.inProgress),
|
|
153
|
+
failed: BigInt(result.summary.tasks.failed),
|
|
154
|
+
error: BigInt(result.summary.tasks.error),
|
|
155
|
+
staleRunning: BigInt(result.summary.tasks.staleRunning),
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
export function createExecutionRoutes(repoPath) {
|
|
161
|
+
const app = new Hono();
|
|
162
|
+
// POST /api/workspaces/:ws/start - Start dataflow execution (non-blocking)
|
|
163
|
+
app.post('/start', async (c) => {
|
|
164
|
+
const workspace = c.req.param('ws');
|
|
165
|
+
if (!workspace) {
|
|
166
|
+
return sendError(c, NullType, errorToVariant(new Error('Missing workspace parameter')));
|
|
167
|
+
}
|
|
168
|
+
try {
|
|
169
|
+
const body = await decodeBody(c, DataflowRequestType);
|
|
170
|
+
// Acquire lock first - this will throw WorkspaceLockError if already locked
|
|
171
|
+
const lock = await acquireWorkspaceLock(repoPath, workspace);
|
|
172
|
+
// Spawn dataflow execution in background
|
|
173
|
+
const concurrency = body.concurrency.type === 'some' ? Number(body.concurrency.value) : 4;
|
|
174
|
+
const filter = body.filter.type === 'some' ? body.filter.value : undefined;
|
|
175
|
+
// Start execution without awaiting - it runs in background
|
|
176
|
+
dataflowStart(repoPath, workspace, {
|
|
177
|
+
concurrency,
|
|
178
|
+
force: body.force,
|
|
179
|
+
filter,
|
|
180
|
+
lock,
|
|
181
|
+
}).catch((err) => {
|
|
182
|
+
// Log error but don't throw - execution is in background
|
|
183
|
+
console.error(`Dataflow execution error for workspace ${workspace}:`, err);
|
|
184
|
+
});
|
|
185
|
+
// Return immediately with 202 Accepted
|
|
186
|
+
c.status(202);
|
|
187
|
+
return sendSuccess(c, NullType, null);
|
|
188
|
+
}
|
|
189
|
+
catch (err) {
|
|
190
|
+
return sendError(c, NullType, errorToVariant(err));
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
// POST /api/workspaces/:ws/execute - Execute dataflow (blocking)
|
|
194
|
+
app.post('/execute', async (c) => {
|
|
195
|
+
const workspace = c.req.param('ws');
|
|
196
|
+
if (!workspace) {
|
|
197
|
+
return sendError(c, DataflowResultType, errorToVariant(new Error('Missing workspace parameter')));
|
|
198
|
+
}
|
|
199
|
+
try {
|
|
200
|
+
const body = await decodeBody(c, DataflowRequestType);
|
|
201
|
+
const concurrency = body.concurrency.type === 'some' ? Number(body.concurrency.value) : 4;
|
|
202
|
+
const filter = body.filter.type === 'some' ? body.filter.value : undefined;
|
|
203
|
+
const result = await dataflowExecute(repoPath, workspace, {
|
|
204
|
+
concurrency,
|
|
205
|
+
force: body.force,
|
|
206
|
+
filter,
|
|
207
|
+
});
|
|
208
|
+
return sendSuccess(c, DataflowResultType, convertDataflowResult(result));
|
|
209
|
+
}
|
|
210
|
+
catch (err) {
|
|
211
|
+
return sendError(c, DataflowResultType, errorToVariant(err));
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
// GET /api/workspaces/:ws/status - Get workspace status (for polling)
|
|
215
|
+
app.get('/status', async (c) => {
|
|
216
|
+
const workspace = c.req.param('ws');
|
|
217
|
+
if (!workspace) {
|
|
218
|
+
return sendError(c, WorkspaceStatusResultType, errorToVariant(new Error('Missing workspace parameter')));
|
|
219
|
+
}
|
|
220
|
+
try {
|
|
221
|
+
const result = await workspaceStatus(repoPath, workspace);
|
|
222
|
+
return sendSuccess(c, WorkspaceStatusResultType, convertWorkspaceStatus(result));
|
|
223
|
+
}
|
|
224
|
+
catch (err) {
|
|
225
|
+
return sendError(c, WorkspaceStatusResultType, errorToVariant(err));
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
// GET /api/workspaces/:ws/graph - Get dependency graph
|
|
229
|
+
app.get('/graph', async (c) => {
|
|
230
|
+
const workspace = c.req.param('ws');
|
|
231
|
+
if (!workspace) {
|
|
232
|
+
return sendError(c, DataflowGraphType, errorToVariant(new Error('Missing workspace parameter')));
|
|
233
|
+
}
|
|
234
|
+
try {
|
|
235
|
+
const graph = await dataflowGetGraph(repoPath, workspace);
|
|
236
|
+
return sendSuccess(c, DataflowGraphType, {
|
|
237
|
+
tasks: graph.tasks.map((t) => ({
|
|
238
|
+
name: t.name,
|
|
239
|
+
hash: t.hash,
|
|
240
|
+
inputs: t.inputs,
|
|
241
|
+
output: t.output,
|
|
242
|
+
dependsOn: t.dependsOn,
|
|
243
|
+
})),
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
catch (err) {
|
|
247
|
+
return sendError(c, DataflowGraphType, errorToVariant(err));
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
// GET /api/workspaces/:ws/logs/:task - Get task logs
|
|
251
|
+
app.get('/logs/:task', async (c) => {
|
|
252
|
+
const workspace = c.req.param('ws');
|
|
253
|
+
const taskName = c.req.param('task');
|
|
254
|
+
if (!workspace) {
|
|
255
|
+
return sendError(c, LogChunkType, errorToVariant(new Error('Missing workspace parameter')));
|
|
256
|
+
}
|
|
257
|
+
if (!taskName) {
|
|
258
|
+
return sendError(c, LogChunkType, errorToVariant(new Error('Missing task parameter')));
|
|
259
|
+
}
|
|
260
|
+
try {
|
|
261
|
+
// Get query params
|
|
262
|
+
const stream = c.req.query('stream') || 'stdout';
|
|
263
|
+
const offset = parseInt(c.req.query('offset') || '0', 10);
|
|
264
|
+
const limit = parseInt(c.req.query('limit') || '65536', 10);
|
|
265
|
+
// Get task hash and current input hashes
|
|
266
|
+
const taskHash = await workspaceGetTaskHash(repoPath, workspace, taskName);
|
|
267
|
+
const task = await workspaceGetTask(repoPath, workspace, taskName);
|
|
268
|
+
// Get current input hashes
|
|
269
|
+
const currentInputHashes = [];
|
|
270
|
+
for (const inputPath of task.inputs) {
|
|
271
|
+
const { refType, hash } = await workspaceGetDatasetHash(repoPath, workspace, inputPath);
|
|
272
|
+
if (refType !== 'value' || hash === null) {
|
|
273
|
+
return sendError(c, LogChunkType, errorToVariant(new Error('Task inputs not assigned')));
|
|
274
|
+
}
|
|
275
|
+
currentInputHashes.push(hash);
|
|
276
|
+
}
|
|
277
|
+
const inHash = inputsHash(currentInputHashes);
|
|
278
|
+
// Check if execution exists, fall back to most recent
|
|
279
|
+
const executions = await executionListForTask(repoPath, taskHash);
|
|
280
|
+
let execInHash = inHash;
|
|
281
|
+
if (!executions.includes(inHash) && executions.length > 0) {
|
|
282
|
+
execInHash = executions[0];
|
|
283
|
+
}
|
|
284
|
+
else if (executions.length === 0) {
|
|
285
|
+
return sendError(c, LogChunkType, errorToVariant(new Error('No executions found for task')));
|
|
286
|
+
}
|
|
287
|
+
// Read logs
|
|
288
|
+
const chunk = await executionReadLog(repoPath, taskHash, execInHash, stream, { offset, limit });
|
|
289
|
+
return sendSuccess(c, LogChunkType, {
|
|
290
|
+
data: chunk.data,
|
|
291
|
+
offset: BigInt(chunk.offset),
|
|
292
|
+
size: BigInt(chunk.size),
|
|
293
|
+
totalSize: BigInt(chunk.totalSize),
|
|
294
|
+
complete: chunk.complete,
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
catch (err) {
|
|
298
|
+
return sendError(c, LogChunkType, errorToVariant(err));
|
|
299
|
+
}
|
|
300
|
+
});
|
|
301
|
+
return app;
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=executions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executions.js","sourceRoot":"","sources":["../../../src/routes/executions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import { Hono } from 'hono';
|
|
6
|
+
export declare function createPackageRoutes(repoPath: string): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
|
|
7
|
+
//# sourceMappingURL=packages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packages.d.ts","sourceRoot":"","sources":["../../../src/routes/packages.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAc5B,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,8EA+GnD"}
|
|
@@ -0,0 +1,124 @@
|
|
|
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 { Hono } from 'hono';
|
|
9
|
+
import { ArrayType, BlobType, NullType } from '@elaraai/east';
|
|
10
|
+
import { packageList, packageImport, packageExport, packageRemove, packageRead, } from '@elaraai/e3-core';
|
|
11
|
+
import { PackageObjectType } from '@elaraai/e3-types';
|
|
12
|
+
import { sendSuccess, sendError } from '../beast2.js';
|
|
13
|
+
import { errorToVariant } from '../errors.js';
|
|
14
|
+
import { PackageListItemType, PackageImportResultType } from '../types.js';
|
|
15
|
+
export function createPackageRoutes(repoPath) {
|
|
16
|
+
const app = new Hono();
|
|
17
|
+
// GET /api/packages - List all packages
|
|
18
|
+
app.get('/', async (c) => {
|
|
19
|
+
try {
|
|
20
|
+
const packages = await packageList(repoPath);
|
|
21
|
+
const result = packages.map((pkg) => ({
|
|
22
|
+
name: pkg.name,
|
|
23
|
+
version: pkg.version,
|
|
24
|
+
}));
|
|
25
|
+
return sendSuccess(c, ArrayType(PackageListItemType), result);
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
return sendError(c, ArrayType(PackageListItemType), errorToVariant(err));
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
// GET /api/packages/:name/:version - Get package details
|
|
32
|
+
app.get('/:name/:version', async (c) => {
|
|
33
|
+
try {
|
|
34
|
+
const name = c.req.param('name');
|
|
35
|
+
const version = c.req.param('version');
|
|
36
|
+
if (!name || !version) {
|
|
37
|
+
return sendError(c, PackageObjectType, errorToVariant(new Error('Missing name or version parameter')));
|
|
38
|
+
}
|
|
39
|
+
const pkg = await packageRead(repoPath, name, version);
|
|
40
|
+
return sendSuccess(c, PackageObjectType, pkg);
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
return sendError(c, PackageObjectType, errorToVariant(err));
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
// POST /api/packages - Import a package from zip
|
|
47
|
+
app.post('/', async (c) => {
|
|
48
|
+
try {
|
|
49
|
+
// Read raw body as zip bytes
|
|
50
|
+
const contentType = c.req.header('content-type');
|
|
51
|
+
let archive;
|
|
52
|
+
if (contentType === 'application/beast2') {
|
|
53
|
+
// BEAST2 encoded blob
|
|
54
|
+
const { decodeBody } = await import('../beast2.js');
|
|
55
|
+
archive = await decodeBody(c, BlobType);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
// Raw zip bytes
|
|
59
|
+
const buffer = await c.req.arrayBuffer();
|
|
60
|
+
archive = new Uint8Array(buffer);
|
|
61
|
+
}
|
|
62
|
+
// Write to temp file
|
|
63
|
+
const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'e3-import-'));
|
|
64
|
+
const tempPath = path.join(tempDir, 'package.zip');
|
|
65
|
+
try {
|
|
66
|
+
await fs.writeFile(tempPath, archive);
|
|
67
|
+
const result = await packageImport(repoPath, tempPath);
|
|
68
|
+
return sendSuccess(c, PackageImportResultType, {
|
|
69
|
+
name: result.name,
|
|
70
|
+
version: result.version,
|
|
71
|
+
packageHash: result.packageHash,
|
|
72
|
+
objectCount: BigInt(result.objectCount),
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
return sendError(c, PackageImportResultType, errorToVariant(err));
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
// GET /api/packages/:name/:version/export - Export package as zip
|
|
84
|
+
app.get('/:name/:version/export', async (c) => {
|
|
85
|
+
try {
|
|
86
|
+
const name = c.req.param('name');
|
|
87
|
+
const version = c.req.param('version');
|
|
88
|
+
if (!name || !version) {
|
|
89
|
+
return sendError(c, BlobType, errorToVariant(new Error('Missing name or version parameter')));
|
|
90
|
+
}
|
|
91
|
+
// Export to temp file
|
|
92
|
+
const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'e3-export-'));
|
|
93
|
+
const tempPath = path.join(tempDir, 'package.zip');
|
|
94
|
+
try {
|
|
95
|
+
await packageExport(repoPath, name, version, tempPath);
|
|
96
|
+
const archive = await fs.readFile(tempPath);
|
|
97
|
+
return sendSuccess(c, BlobType, new Uint8Array(archive));
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
return sendError(c, BlobType, errorToVariant(err));
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
// DELETE /api/packages/:name/:version - Remove a package
|
|
108
|
+
app.delete('/:name/:version', async (c) => {
|
|
109
|
+
try {
|
|
110
|
+
const name = c.req.param('name');
|
|
111
|
+
const version = c.req.param('version');
|
|
112
|
+
if (!name || !version) {
|
|
113
|
+
return sendError(c, NullType, errorToVariant(new Error('Missing name or version parameter')));
|
|
114
|
+
}
|
|
115
|
+
await packageRemove(repoPath, name, version);
|
|
116
|
+
return sendSuccess(c, NullType, null);
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
return sendError(c, NullType, errorToVariant(err));
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
return app;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=packages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packages.js","sourceRoot":"","sources":["../../../src/routes/packages.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import { Hono } from 'hono';
|
|
6
|
+
export declare function createRepositoryRoutes(repoPath: string): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
|
|
7
|
+
//# sourceMappingURL=repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/routes/repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAM5B,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,8EAwDtD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
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 { Hono } from 'hono';
|
|
8
|
+
import { repoGc, packageList, workspaceList } from '@elaraai/e3-core';
|
|
9
|
+
import { decodeBody, sendSuccess, sendError } from '../beast2.js';
|
|
10
|
+
import { errorToVariant } from '../errors.js';
|
|
11
|
+
import { RepositoryStatusType, GcRequestType, GcResultType } from '../types.js';
|
|
12
|
+
export function createRepositoryRoutes(repoPath) {
|
|
13
|
+
const app = new Hono();
|
|
14
|
+
// GET /api/status - Get repository status
|
|
15
|
+
app.get('/status', async (c) => {
|
|
16
|
+
try {
|
|
17
|
+
// Count objects
|
|
18
|
+
const objectsDir = path.join(repoPath, 'objects');
|
|
19
|
+
let objectCount = 0;
|
|
20
|
+
try {
|
|
21
|
+
const subdirs = await fs.readdir(objectsDir);
|
|
22
|
+
for (const subdir of subdirs) {
|
|
23
|
+
if (subdir.length === 2) {
|
|
24
|
+
const files = await fs.readdir(path.join(objectsDir, subdir));
|
|
25
|
+
objectCount += files.length;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// objects dir doesn't exist
|
|
31
|
+
}
|
|
32
|
+
// Count packages and workspaces
|
|
33
|
+
const packages = await packageList(repoPath);
|
|
34
|
+
const workspaces = await workspaceList(repoPath);
|
|
35
|
+
const status = {
|
|
36
|
+
path: repoPath,
|
|
37
|
+
objectCount: BigInt(objectCount),
|
|
38
|
+
packageCount: BigInt(packages.length),
|
|
39
|
+
workspaceCount: BigInt(workspaces.length),
|
|
40
|
+
};
|
|
41
|
+
return sendSuccess(c, RepositoryStatusType, status);
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
return sendError(c, RepositoryStatusType, errorToVariant(err));
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
// POST /api/gc - Run garbage collection
|
|
48
|
+
app.post('/gc', async (c) => {
|
|
49
|
+
try {
|
|
50
|
+
const options = await decodeBody(c, GcRequestType);
|
|
51
|
+
const minAge = options.minAge?.type === 'some' ? Number(options.minAge.value) : undefined;
|
|
52
|
+
const result = await repoGc(repoPath, { dryRun: options.dryRun, minAge });
|
|
53
|
+
return sendSuccess(c, GcResultType, {
|
|
54
|
+
deletedObjects: BigInt(result.deletedObjects),
|
|
55
|
+
deletedPartials: BigInt(result.deletedPartials),
|
|
56
|
+
retainedObjects: BigInt(result.retainedObjects),
|
|
57
|
+
skippedYoung: BigInt(result.skippedYoung),
|
|
58
|
+
bytesFreed: BigInt(result.bytesFreed),
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
return sendError(c, GcResultType, errorToVariant(err));
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
return app;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/routes/repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import { Hono } from 'hono';
|
|
6
|
+
export declare function createTaskRoutes(repoPath: string): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
|
|
7
|
+
//# sourceMappingURL=tasks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../../src/routes/tasks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAW5B,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,8EAqDhD"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import { Hono } from 'hono';
|
|
6
|
+
import { ArrayType } from '@elaraai/east';
|
|
7
|
+
import { workspaceListTasks, workspaceGetTask, workspaceGetTaskHash, } from '@elaraai/e3-core';
|
|
8
|
+
import { sendSuccess, sendError } from '../beast2.js';
|
|
9
|
+
import { errorToVariant } from '../errors.js';
|
|
10
|
+
import { TaskInfoType, TaskDetailsType } from '../types.js';
|
|
11
|
+
export function createTaskRoutes(repoPath) {
|
|
12
|
+
const app = new Hono();
|
|
13
|
+
// GET /api/workspaces/:ws/tasks - List tasks
|
|
14
|
+
app.get('/', async (c) => {
|
|
15
|
+
try {
|
|
16
|
+
const workspace = c.req.param('ws');
|
|
17
|
+
if (!workspace) {
|
|
18
|
+
return sendError(c, ArrayType(TaskInfoType), errorToVariant(new Error('Missing workspace parameter')));
|
|
19
|
+
}
|
|
20
|
+
// workspaceListTasks returns string[] of task names
|
|
21
|
+
const taskNames = await workspaceListTasks(repoPath, workspace);
|
|
22
|
+
// Get hash for each task
|
|
23
|
+
const result = await Promise.all(taskNames.map(async (name) => {
|
|
24
|
+
const hash = await workspaceGetTaskHash(repoPath, workspace, name);
|
|
25
|
+
return { name, hash };
|
|
26
|
+
}));
|
|
27
|
+
return sendSuccess(c, ArrayType(TaskInfoType), result);
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
return sendError(c, ArrayType(TaskInfoType), errorToVariant(err));
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
// GET /api/workspaces/:ws/tasks/:name - Get task details
|
|
34
|
+
app.get('/:name', async (c) => {
|
|
35
|
+
try {
|
|
36
|
+
const workspace = c.req.param('ws');
|
|
37
|
+
const name = c.req.param('name');
|
|
38
|
+
if (!workspace || !name) {
|
|
39
|
+
return sendError(c, TaskDetailsType, errorToVariant(new Error('Missing workspace or task name parameter')));
|
|
40
|
+
}
|
|
41
|
+
// Get hash and task object
|
|
42
|
+
const hash = await workspaceGetTaskHash(repoPath, workspace, name);
|
|
43
|
+
const task = await workspaceGetTask(repoPath, workspace, name);
|
|
44
|
+
return sendSuccess(c, TaskDetailsType, {
|
|
45
|
+
name,
|
|
46
|
+
hash,
|
|
47
|
+
commandIr: task.commandIr,
|
|
48
|
+
inputs: task.inputs,
|
|
49
|
+
output: task.output,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
return sendError(c, TaskDetailsType, errorToVariant(err));
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
return app;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../../src/routes/tasks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import { Hono } from 'hono';
|
|
6
|
+
export declare function createWorkspaceRoutes(repoPath: string): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
|
|
7
|
+
//# sourceMappingURL=workspaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaces.d.ts","sourceRoot":"","sources":["../../../src/routes/workspaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAgB5B,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,8EAyHrD"}
|