@elaraai/e3-api-server 0.0.2-beta.3 → 0.0.2-beta.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/README.md +145 -30
  2. package/dist/src/async-operation-state.d.ts +37 -0
  3. package/dist/src/async-operation-state.d.ts.map +1 -0
  4. package/dist/src/async-operation-state.js +118 -0
  5. package/dist/src/async-operation-state.js.map +1 -0
  6. package/dist/src/auth/device.d.ts +26 -0
  7. package/dist/src/auth/device.d.ts.map +1 -0
  8. package/dist/src/auth/device.js +227 -0
  9. package/dist/src/auth/device.js.map +1 -0
  10. package/dist/src/auth/discovery.d.ts +23 -0
  11. package/dist/src/auth/discovery.d.ts.map +1 -0
  12. package/dist/src/auth/discovery.js +40 -0
  13. package/dist/src/auth/discovery.js.map +1 -0
  14. package/dist/src/auth/index.d.ts +56 -0
  15. package/dist/src/auth/index.d.ts.map +1 -0
  16. package/dist/src/auth/index.js +69 -0
  17. package/dist/src/auth/index.js.map +1 -0
  18. package/dist/src/auth/keys.d.ts +55 -0
  19. package/dist/src/auth/keys.d.ts.map +1 -0
  20. package/dist/src/auth/keys.js +78 -0
  21. package/dist/src/auth/keys.js.map +1 -0
  22. package/dist/src/beast2.d.ts +15 -3
  23. package/dist/src/beast2.d.ts.map +1 -1
  24. package/dist/src/beast2.js +30 -4
  25. package/dist/src/beast2.js.map +1 -1
  26. package/dist/src/cli.js +58 -6
  27. package/dist/src/cli.js.map +1 -1
  28. package/dist/src/errors.d.ts.map +1 -1
  29. package/dist/src/errors.js +8 -2
  30. package/dist/src/errors.js.map +1 -1
  31. package/dist/src/handlers/dataflow.d.ts +43 -0
  32. package/dist/src/handlers/dataflow.d.ts.map +1 -0
  33. package/dist/src/handlers/dataflow.js +363 -0
  34. package/dist/src/handlers/dataflow.js.map +1 -0
  35. package/dist/src/handlers/datasets.d.ts +23 -0
  36. package/dist/src/handlers/datasets.d.ts.map +1 -0
  37. package/dist/src/handlers/datasets.js +113 -0
  38. package/dist/src/handlers/datasets.js.map +1 -0
  39. package/dist/src/handlers/index.d.ts +11 -0
  40. package/dist/src/handlers/index.d.ts.map +1 -0
  41. package/dist/src/handlers/index.js +11 -0
  42. package/dist/src/handlers/index.js.map +1 -0
  43. package/dist/src/handlers/packages.d.ts +26 -0
  44. package/dist/src/handlers/packages.d.ts.map +1 -0
  45. package/dist/src/handlers/packages.js +101 -0
  46. package/dist/src/handlers/packages.js.map +1 -0
  47. package/dist/src/handlers/repository.d.ts +24 -0
  48. package/dist/src/handlers/repository.d.ts.map +1 -0
  49. package/dist/src/handlers/repository.js +79 -0
  50. package/dist/src/handlers/repository.js.map +1 -0
  51. package/dist/src/handlers/tasks.d.ts +18 -0
  52. package/dist/src/handlers/tasks.d.ts.map +1 -0
  53. package/dist/src/handlers/tasks.js +134 -0
  54. package/dist/src/handlers/tasks.js.map +1 -0
  55. package/dist/src/handlers/workspaces.d.ts +34 -0
  56. package/dist/src/handlers/workspaces.d.ts.map +1 -0
  57. package/dist/src/handlers/workspaces.js +225 -0
  58. package/dist/src/handlers/workspaces.js.map +1 -0
  59. package/dist/src/index.d.ts +3 -0
  60. package/dist/src/index.d.ts.map +1 -1
  61. package/dist/src/index.js +6 -0
  62. package/dist/src/index.js.map +1 -1
  63. package/dist/src/middleware/auth.d.ts +51 -0
  64. package/dist/src/middleware/auth.d.ts.map +1 -0
  65. package/dist/src/middleware/auth.js +158 -0
  66. package/dist/src/middleware/auth.js.map +1 -0
  67. package/dist/src/orchestrator-manager.d.ts +45 -0
  68. package/dist/src/orchestrator-manager.d.ts.map +1 -0
  69. package/dist/src/orchestrator-manager.js +150 -0
  70. package/dist/src/orchestrator-manager.js.map +1 -0
  71. package/dist/src/routes/datasets.d.ts +2 -1
  72. package/dist/src/routes/datasets.d.ts.map +1 -1
  73. package/dist/src/routes/datasets.js +50 -85
  74. package/dist/src/routes/datasets.js.map +1 -1
  75. package/dist/src/routes/executions.d.ts +2 -1
  76. package/dist/src/routes/executions.d.ts.map +1 -1
  77. package/dist/src/routes/executions.js +54 -287
  78. package/dist/src/routes/executions.js.map +1 -1
  79. package/dist/src/routes/index.d.ts +11 -0
  80. package/dist/src/routes/index.d.ts.map +1 -0
  81. package/dist/src/routes/index.js +11 -0
  82. package/dist/src/routes/index.js.map +1 -0
  83. package/dist/src/routes/packages.d.ts +2 -1
  84. package/dist/src/routes/packages.d.ts.map +1 -1
  85. package/dist/src/routes/packages.js +42 -105
  86. package/dist/src/routes/packages.js.map +1 -1
  87. package/dist/src/routes/repository.d.ts +2 -1
  88. package/dist/src/routes/repository.d.ts.map +1 -1
  89. package/dist/src/routes/repository.js +19 -54
  90. package/dist/src/routes/repository.js.map +1 -1
  91. package/dist/src/routes/tasks.d.ts +2 -1
  92. package/dist/src/routes/tasks.d.ts.map +1 -1
  93. package/dist/src/routes/tasks.js +22 -46
  94. package/dist/src/routes/tasks.js.map +1 -1
  95. package/dist/src/routes/workspaces.d.ts +2 -1
  96. package/dist/src/routes/workspaces.d.ts.map +1 -1
  97. package/dist/src/routes/workspaces.js +45 -116
  98. package/dist/src/routes/workspaces.js.map +1 -1
  99. package/dist/src/server.d.ts +24 -3
  100. package/dist/src/server.d.ts.map +1 -1
  101. package/dist/src/server.js +238 -19
  102. package/dist/src/server.js.map +1 -1
  103. package/dist/src/types.d.ts +1197 -721
  104. package/dist/src/types.d.ts.map +1 -1
  105. package/dist/src/types.js +192 -2
  106. package/dist/src/types.js.map +1 -1
  107. package/package.json +16 -4
@@ -2,122 +2,59 @@
2
2
  * Copyright (c) 2025 Elara AI Pty Ltd
3
3
  * Licensed under BSL 1.1. See LICENSE for details.
4
4
  */
5
- import * as fs from 'node:fs/promises';
6
- import * as os from 'node:os';
7
- import * as path from 'node:path';
8
5
  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) {
6
+ import { BlobType } from '@elaraai/east';
7
+ import { listPackages, getPackage, importPackage, exportPackage, deletePackage, } from '../handlers/packages.js';
8
+ import { decodeBody } from '../beast2.js';
9
+ export function createPackageRoutes(storage, getRepoPath) {
16
10
  const app = new Hono();
17
- // GET /api/packages - List all packages
11
+ // GET /api/repos/:repo/packages - List all packages
18
12
  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
- }
13
+ const repo = c.req.param('repo');
14
+ const repoPath = getRepoPath(repo);
15
+ return listPackages(storage, repoPath);
30
16
  });
31
- // GET /api/packages/:name/:version - Get package details
17
+ // GET /api/repos/:repo/packages/:name/:version - Get package details
32
18
  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
- }
19
+ const repo = c.req.param('repo');
20
+ const repoPath = getRepoPath(repo);
21
+ const name = c.req.param('name');
22
+ const version = c.req.param('version');
23
+ return getPackage(storage, repoPath, name, version);
45
24
  });
46
- // POST /api/packages - Import a package from zip
25
+ // POST /api/repos/:repo/packages - Import a package from zip
47
26
  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
- }
27
+ const repo = c.req.param('repo');
28
+ const repoPath = getRepoPath(repo);
29
+ // Read raw body as zip bytes
30
+ const contentType = c.req.header('content-type');
31
+ let archive;
32
+ if (contentType === 'application/beast2') {
33
+ // BEAST2 encoded blob
34
+ archive = await decodeBody(c, BlobType);
35
+ }
36
+ else {
37
+ // Raw zip bytes
38
+ const buffer = await c.req.arrayBuffer();
39
+ archive = new Uint8Array(buffer);
40
+ }
41
+ return importPackage(storage, repoPath, archive);
82
42
  });
83
- // GET /api/packages/:name/:version/export - Export package as zip
43
+ // GET /api/repos/:repo/packages/:name/:version/export - Export package as zip
84
44
  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
- }
45
+ const repo = c.req.param('repo');
46
+ const repoPath = getRepoPath(repo);
47
+ const name = c.req.param('name');
48
+ const version = c.req.param('version');
49
+ return exportPackage(storage, repoPath, name, version);
106
50
  });
107
- // DELETE /api/packages/:name/:version - Remove a package
51
+ // DELETE /api/repos/:repo/packages/:name/:version - Remove a package
108
52
  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
- }
53
+ const repo = c.req.param('repo');
54
+ const repoPath = getRepoPath(repo);
55
+ const name = c.req.param('name');
56
+ const version = c.req.param('version');
57
+ return deletePackage(storage, repoPath, name, version);
121
58
  });
122
59
  return app;
123
60
  }
@@ -1 +1 @@
1
- {"version":3,"file":"packages.js","sourceRoot":"","sources":["../../../src/routes/packages.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"packages.js","sourceRoot":"","sources":["../../../src/routes/packages.ts"],"names":[],"mappings":"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"}
@@ -3,5 +3,6 @@
3
3
  * Licensed under BSL 1.1. See LICENSE for details.
4
4
  */
5
5
  import { Hono } from 'hono';
6
- export declare function createRepositoryRoutes(repoPath: string): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
6
+ import type { StorageBackend } from '@elaraai/e3-core';
7
+ export declare function createRepositoryRoutes(storage: StorageBackend, getRepoPath: (repo: string) => string): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
7
8
  //# sourceMappingURL=repository.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/routes/repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAKvD,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,8EA2BtC"}
@@ -2,65 +2,30 @@
2
2
  * Copyright (c) 2025 Elara AI Pty Ltd
3
3
  * Licensed under BSL 1.1. See LICENSE for details.
4
4
  */
5
- import * as fs from 'node:fs/promises';
6
- import * as path from 'node:path';
7
5
  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) {
6
+ import { getStatus, startGc, getGcStatus } from '../handlers/repository.js';
7
+ import { decodeBody } from '../beast2.js';
8
+ import { GcRequestType } from '../types.js';
9
+ export function createRepositoryRoutes(storage, getRepoPath) {
13
10
  const app = new Hono();
14
- // GET /api/status - Get repository status
11
+ // GET /api/repos/:repo/status - Get repository status
15
12
  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
- }
13
+ const repo = c.req.param('repo');
14
+ const repoPath = getRepoPath(repo);
15
+ return getStatus(storage, repoPath);
46
16
  });
47
- // POST /api/gc - Run garbage collection
17
+ // POST /api/repos/:repo/gc - Start garbage collection (async)
48
18
  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
- }
19
+ const repo = c.req.param('repo');
20
+ const repoPath = getRepoPath(repo);
21
+ const options = await decodeBody(c, GcRequestType);
22
+ const minAge = options.minAge?.type === 'some' ? Number(options.minAge.value) : undefined;
23
+ return startGc(storage, repoPath, { dryRun: options.dryRun, minAge });
24
+ });
25
+ // GET /api/repos/:repo/gc/:executionId - Get GC status
26
+ app.get('/gc/:executionId', (c) => {
27
+ const executionId = c.req.param('executionId');
28
+ return getGcStatus(executionId);
64
29
  });
65
30
  return app;
66
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/routes/repository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/routes/repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,UAAU,sBAAsB,CACpC,OAAuB,EACvB,WAAqC;IAErC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvB,sDAAsD;IACtD,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,8DAA8D;IAC9D,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1F,OAAO,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,uDAAuD;IACvD,GAAG,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC,EAAE,EAAE;QAChC,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAE,CAAC;QAChD,OAAO,WAAW,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -3,5 +3,6 @@
3
3
  * Licensed under BSL 1.1. See LICENSE for details.
4
4
  */
5
5
  import { Hono } from 'hono';
6
- export declare function createTaskRoutes(repoPath: string): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
6
+ import type { StorageBackend } from '@elaraai/e3-core';
7
+ export declare function createTaskRoutes(storage: StorageBackend, getRepoPath: (repo: string) => string): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
7
8
  //# sourceMappingURL=tasks.d.ts.map
@@ -1 +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"}
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;AAC5B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGvD,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,8EA+BtC"}
@@ -3,55 +3,31 @@
3
3
  * Licensed under BSL 1.1. See LICENSE for details.
4
4
  */
5
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) {
6
+ import { listTasks, getTask, listExecutions } from '../handlers/tasks.js';
7
+ export function createTaskRoutes(storage, getRepoPath) {
12
8
  const app = new Hono();
13
- // GET /api/workspaces/:ws/tasks - List tasks
9
+ // GET /api/repos/:repo/workspaces/:ws/tasks - List tasks
14
10
  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
- }
11
+ const repo = c.req.param('repo');
12
+ const repoPath = getRepoPath(repo);
13
+ const ws = c.req.param('ws');
14
+ return listTasks(storage, repoPath, ws);
32
15
  });
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
- }
16
+ // GET /api/repos/:repo/workspaces/:ws/tasks/:task - Get task details
17
+ app.get('/:task', async (c) => {
18
+ const repo = c.req.param('repo');
19
+ const repoPath = getRepoPath(repo);
20
+ const ws = c.req.param('ws');
21
+ const taskName = c.req.param('task');
22
+ return getTask(storage, repoPath, ws, taskName);
23
+ });
24
+ // GET /api/repos/:repo/workspaces/:ws/tasks/:task/executions - List execution history
25
+ app.get('/:task/executions', async (c) => {
26
+ const repo = c.req.param('repo');
27
+ const repoPath = getRepoPath(repo);
28
+ const ws = c.req.param('ws');
29
+ const taskName = c.req.param('task');
30
+ return listExecutions(storage, repoPath, ws, taskName);
55
31
  });
56
32
  return app;
57
33
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../../src/routes/tasks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../../src/routes/tasks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE1E,MAAM,UAAU,gBAAgB,CAC9B,OAAuB,EACvB,WAAqC;IAErC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvB,yDAAyD;IACzD,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACvB,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAE,CAAC;QAC9B,OAAO,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,qEAAqE;IACrE,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC5B,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAE,CAAC;QACtC,OAAO,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,sFAAsF;IACtF,GAAG,CAAC,GAAG,CAAC,mBAAmB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACvC,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAE,CAAC;QACtC,OAAO,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -3,5 +3,6 @@
3
3
  * Licensed under BSL 1.1. See LICENSE for details.
4
4
  */
5
5
  import { Hono } from 'hono';
6
- export declare function createWorkspaceRoutes(repoPath: string): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
6
+ import type { StorageBackend } from '@elaraai/e3-core';
7
+ export declare function createWorkspaceRoutes(storage: StorageBackend, getRepoPath: (repo: string) => string): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
7
8
  //# sourceMappingURL=workspaces.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"workspaces.d.ts","sourceRoot":"","sources":["../../../src/routes/workspaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAavD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,8EA6DtC"}
@@ -2,131 +2,60 @@
2
2
  * Copyright (c) 2025 Elara AI Pty Ltd
3
3
  * Licensed under BSL 1.1. See LICENSE for details.
4
4
  */
5
- import * as fs from 'node:fs/promises';
6
- import * as os from 'node:os';
7
- import * as path from 'node:path';
8
5
  import { Hono } from 'hono';
9
- import { ArrayType, BlobType, NullType, some, none } from '@elaraai/east';
10
- import { WorkspaceStateType, parsePackageRef } from '@elaraai/e3-types';
11
- import { workspaceList, workspaceCreate, workspaceRemove, workspaceGetState, workspaceDeploy, workspaceExport, packageGetLatestVersion, } from '@elaraai/e3-core';
12
- import { decodeBody, sendSuccess, sendError } from '../beast2.js';
13
- import { errorToVariant } from '../errors.js';
14
- import { WorkspaceInfoType, CreateWorkspaceType, DeployRequestType } from '../types.js';
15
- export function createWorkspaceRoutes(repoPath) {
6
+ import { listWorkspaces, createWorkspace, getWorkspace, getWorkspaceStatus, deleteWorkspace, deployWorkspace, exportWorkspace, } from '../handlers/workspaces.js';
7
+ import { decodeBody } from '../beast2.js';
8
+ import { CreateWorkspaceType, DeployRequestType } from '../types.js';
9
+ export function createWorkspaceRoutes(storage, getRepoPath) {
16
10
  const app = new Hono();
17
- // GET /api/workspaces - List all workspaces
11
+ // GET /api/repos/:repo/workspaces - List all workspaces
18
12
  app.get('/', async (c) => {
19
- try {
20
- const workspaces = await workspaceList(repoPath);
21
- const result = await Promise.all(workspaces.map(async (name) => {
22
- const state = await workspaceGetState(repoPath, name);
23
- if (state) {
24
- return {
25
- name,
26
- deployed: true,
27
- packageName: some(state.packageName),
28
- packageVersion: some(state.packageVersion),
29
- };
30
- }
31
- else {
32
- return {
33
- name,
34
- deployed: false,
35
- packageName: none,
36
- packageVersion: none,
37
- };
38
- }
39
- }));
40
- return sendSuccess(c, ArrayType(WorkspaceInfoType), result);
41
- }
42
- catch (err) {
43
- return sendError(c, ArrayType(WorkspaceInfoType), errorToVariant(err));
44
- }
13
+ const repo = c.req.param('repo');
14
+ const repoPath = getRepoPath(repo);
15
+ return listWorkspaces(storage, repoPath);
45
16
  });
46
- // POST /api/workspaces - Create a new workspace
17
+ // POST /api/repos/:repo/workspaces - Create a new workspace
47
18
  app.post('/', async (c) => {
48
- try {
49
- const body = await decodeBody(c, CreateWorkspaceType);
50
- await workspaceCreate(repoPath, body.name);
51
- return sendSuccess(c, WorkspaceInfoType, {
52
- name: body.name,
53
- deployed: false,
54
- packageName: none,
55
- packageVersion: none,
56
- });
57
- }
58
- catch (err) {
59
- return sendError(c, WorkspaceInfoType, errorToVariant(err));
60
- }
19
+ const repo = c.req.param('repo');
20
+ const repoPath = getRepoPath(repo);
21
+ const body = await decodeBody(c, CreateWorkspaceType);
22
+ return createWorkspace(storage, repoPath, body.name);
61
23
  });
62
- // GET /api/workspaces/:name - Get workspace state
63
- app.get('/:name', async (c) => {
64
- try {
65
- const name = c.req.param('name');
66
- const state = await workspaceGetState(repoPath, name);
67
- if (!state) {
68
- // Workspace exists but not deployed - return error
69
- return sendError(c, WorkspaceStateType, errorToVariant(new Error(`Workspace '${name}' is not deployed`)));
70
- }
71
- return sendSuccess(c, WorkspaceStateType, state);
72
- }
73
- catch (err) {
74
- return sendError(c, WorkspaceStateType, errorToVariant(err));
75
- }
24
+ // GET /api/repos/:repo/workspaces/:ws - Get workspace state
25
+ app.get('/:ws', async (c) => {
26
+ const repo = c.req.param('repo');
27
+ const repoPath = getRepoPath(repo);
28
+ const ws = c.req.param('ws');
29
+ return getWorkspace(storage, repoPath, ws);
76
30
  });
77
- // DELETE /api/workspaces/:name - Remove a workspace
78
- app.delete('/:name', async (c) => {
79
- try {
80
- const name = c.req.param('name');
81
- await workspaceRemove(repoPath, name);
82
- return sendSuccess(c, NullType, null);
83
- }
84
- catch (err) {
85
- return sendError(c, NullType, errorToVariant(err));
86
- }
31
+ // GET /api/repos/:repo/workspaces/:ws/status - Get comprehensive workspace status
32
+ app.get('/:ws/status', (c) => {
33
+ const repo = c.req.param('repo');
34
+ const repoPath = getRepoPath(repo);
35
+ const ws = c.req.param('ws');
36
+ return getWorkspaceStatus(storage, repoPath, ws);
87
37
  });
88
- // POST /api/workspaces/:name/deploy - Deploy a package to a workspace
89
- app.post('/:name/deploy', async (c) => {
90
- try {
91
- const name = c.req.param('name');
92
- if (!name) {
93
- return sendError(c, NullType, errorToVariant(new Error('Missing workspace name parameter')));
94
- }
95
- const body = await decodeBody(c, DeployRequestType);
96
- const { name: pkgName, version: maybeVersion } = parsePackageRef(body.packageRef);
97
- const pkgVersion = maybeVersion ?? await packageGetLatestVersion(repoPath, pkgName);
98
- if (!pkgVersion) {
99
- return sendError(c, NullType, errorToVariant(new Error(`Package not found: ${pkgName}`)));
100
- }
101
- await workspaceDeploy(repoPath, name, pkgName, pkgVersion);
102
- return sendSuccess(c, NullType, null);
103
- }
104
- catch (err) {
105
- return sendError(c, NullType, errorToVariant(err));
106
- }
38
+ // DELETE /api/repos/:repo/workspaces/:ws - Remove a workspace
39
+ app.delete('/:ws', async (c) => {
40
+ const repo = c.req.param('repo');
41
+ const repoPath = getRepoPath(repo);
42
+ const ws = c.req.param('ws');
43
+ return deleteWorkspace(storage, repoPath, ws);
107
44
  });
108
- // GET /api/workspaces/:name/export - Export workspace as a package zip
109
- app.get('/:name/export', async (c) => {
110
- try {
111
- const name = c.req.param('name');
112
- if (!name) {
113
- return sendError(c, BlobType, errorToVariant(new Error('Missing workspace name parameter')));
114
- }
115
- // Export to temp file
116
- const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'e3-ws-export-'));
117
- const tempPath = path.join(tempDir, 'workspace.zip');
118
- try {
119
- await workspaceExport(repoPath, name, tempPath);
120
- const archive = await fs.readFile(tempPath);
121
- return sendSuccess(c, BlobType, new Uint8Array(archive));
122
- }
123
- finally {
124
- await fs.rm(tempDir, { recursive: true, force: true });
125
- }
126
- }
127
- catch (err) {
128
- return sendError(c, BlobType, errorToVariant(err));
129
- }
45
+ // POST /api/repos/:repo/workspaces/:ws/deploy - Deploy a package to a workspace
46
+ app.post('/:ws/deploy', async (c) => {
47
+ const repo = c.req.param('repo');
48
+ const repoPath = getRepoPath(repo);
49
+ const ws = c.req.param('ws');
50
+ const body = await decodeBody(c, DeployRequestType);
51
+ return deployWorkspace(storage, repoPath, ws, body.packageRef);
52
+ });
53
+ // GET /api/repos/:repo/workspaces/:ws/export - Export workspace as a package zip
54
+ app.get('/:ws/export', async (c) => {
55
+ const repo = c.req.param('repo');
56
+ const repoPath = getRepoPath(repo);
57
+ const ws = c.req.param('ws');
58
+ return exportWorkspace(storage, repoPath, ws);
130
59
  });
131
60
  return app;
132
61
  }