@elaraai/e3-api-server 0.0.2-beta.4 → 0.0.2-beta.40

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 (123) 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 +38 -8
  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 +38 -0
  36. package/dist/src/handlers/datasets.d.ts.map +1 -0
  37. package/dist/src/handlers/datasets.js +222 -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 +18 -0
  44. package/dist/src/handlers/packages.d.ts.map +1 -0
  45. package/dist/src/handlers/packages.js +51 -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/data.d.ts +21 -0
  72. package/dist/src/routes/data.d.ts.map +1 -0
  73. package/dist/src/routes/data.js +125 -0
  74. package/dist/src/routes/data.js.map +1 -0
  75. package/dist/src/routes/datasets.d.ts +2 -1
  76. package/dist/src/routes/datasets.d.ts.map +1 -1
  77. package/dist/src/routes/datasets.js +59 -83
  78. package/dist/src/routes/datasets.js.map +1 -1
  79. package/dist/src/routes/executions.d.ts +2 -1
  80. package/dist/src/routes/executions.d.ts.map +1 -1
  81. package/dist/src/routes/executions.js +54 -287
  82. package/dist/src/routes/executions.js.map +1 -1
  83. package/dist/src/routes/index.d.ts +15 -0
  84. package/dist/src/routes/index.d.ts.map +1 -0
  85. package/dist/src/routes/index.js +15 -0
  86. package/dist/src/routes/index.js.map +1 -0
  87. package/dist/src/routes/objects.d.ts +8 -0
  88. package/dist/src/routes/objects.d.ts.map +1 -0
  89. package/dist/src/routes/objects.js +38 -0
  90. package/dist/src/routes/objects.js.map +1 -0
  91. package/dist/src/routes/package-transfer.d.ts +23 -0
  92. package/dist/src/routes/package-transfer.d.ts.map +1 -0
  93. package/dist/src/routes/package-transfer.js +168 -0
  94. package/dist/src/routes/package-transfer.js.map +1 -0
  95. package/dist/src/routes/packages.d.ts +2 -1
  96. package/dist/src/routes/packages.d.ts.map +1 -1
  97. package/dist/src/routes/packages.js +18 -109
  98. package/dist/src/routes/packages.js.map +1 -1
  99. package/dist/src/routes/repository.d.ts +2 -1
  100. package/dist/src/routes/repository.d.ts.map +1 -1
  101. package/dist/src/routes/repository.js +19 -54
  102. package/dist/src/routes/repository.js.map +1 -1
  103. package/dist/src/routes/tasks.d.ts +2 -1
  104. package/dist/src/routes/tasks.d.ts.map +1 -1
  105. package/dist/src/routes/tasks.js +22 -46
  106. package/dist/src/routes/tasks.js.map +1 -1
  107. package/dist/src/routes/transfer.d.ts +19 -0
  108. package/dist/src/routes/transfer.d.ts.map +1 -0
  109. package/dist/src/routes/transfer.js +124 -0
  110. package/dist/src/routes/transfer.js.map +1 -0
  111. package/dist/src/routes/workspaces.d.ts +2 -1
  112. package/dist/src/routes/workspaces.d.ts.map +1 -1
  113. package/dist/src/routes/workspaces.js +45 -116
  114. package/dist/src/routes/workspaces.js.map +1 -1
  115. package/dist/src/server.d.ts +24 -3
  116. package/dist/src/server.d.ts.map +1 -1
  117. package/dist/src/server.js +266 -19
  118. package/dist/src/server.js.map +1 -1
  119. package/dist/src/types.d.ts +1385 -731
  120. package/dist/src/types.d.ts.map +1 -1
  121. package/dist/src/types.js +238 -2
  122. package/dist/src/types.js.map +1 -1
  123. package/package.json +16 -4
@@ -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
+ * Orchestrator manager for e3-api-server.
7
+ *
8
+ * Manages LocalOrchestrator instances per repository, each with its own
9
+ * FileStateStore for durable execution state persistence.
10
+ */
11
+ import { join } from 'node:path';
12
+ import { LocalOrchestrator, FileStateStore, } from '@elaraai/e3-core';
13
+ /**
14
+ * Map of state stores per repository path.
15
+ */
16
+ const stateStores = new Map();
17
+ /**
18
+ * Map of orchestrators per repository path.
19
+ */
20
+ const orchestrators = new Map();
21
+ /**
22
+ * Get or create a FileStateStore for a repository.
23
+ */
24
+ function getOrCreateStateStore(repoPath) {
25
+ let store = stateStores.get(repoPath);
26
+ if (!store) {
27
+ const workspacesDir = join(repoPath, 'workspaces');
28
+ store = new FileStateStore(workspacesDir);
29
+ stateStores.set(repoPath, store);
30
+ }
31
+ return store;
32
+ }
33
+ /**
34
+ * Get or create a LocalOrchestrator for a repository.
35
+ */
36
+ function getOrCreateOrchestrator(repoPath) {
37
+ let orch = orchestrators.get(repoPath);
38
+ if (!orch) {
39
+ const stateStore = getOrCreateStateStore(repoPath);
40
+ orch = new LocalOrchestrator(stateStore);
41
+ orchestrators.set(repoPath, orch);
42
+ }
43
+ return orch;
44
+ }
45
+ /**
46
+ * Map of active execution handles by workspace key.
47
+ * Key format: `${repoPath}::${workspace}`
48
+ */
49
+ const activeExecutions = new Map();
50
+ /**
51
+ * Map of execution start times for duration tracking.
52
+ * Key format: `${repoPath}::${workspace}:${executionId}`
53
+ */
54
+ const executionStartTimes = new Map();
55
+ /**
56
+ * Generate a key for workspace-level lookups.
57
+ */
58
+ function makeWorkspaceKey(repoPath, workspace) {
59
+ return `${repoPath}::${workspace}`;
60
+ }
61
+ /**
62
+ * Generate a key for execution-level lookups.
63
+ */
64
+ function makeExecutionKey(repoPath, workspace, executionId) {
65
+ return `${repoPath}::${workspace}:${executionId}`;
66
+ }
67
+ /**
68
+ * Get the orchestrator for a repository.
69
+ */
70
+ export function getOrchestrator(repoPath) {
71
+ return getOrCreateOrchestrator(repoPath);
72
+ }
73
+ /**
74
+ * Get the state store for a repository.
75
+ */
76
+ export function getStateStore(repoPath) {
77
+ return getOrCreateStateStore(repoPath);
78
+ }
79
+ /**
80
+ * Set the active execution for a workspace.
81
+ * Replaces any previous execution.
82
+ */
83
+ export function setActiveExecution(repoPath, workspace, handle) {
84
+ const key = makeWorkspaceKey(repoPath, workspace);
85
+ activeExecutions.set(key, handle);
86
+ // Record start time for duration tracking
87
+ const execKey = makeExecutionKey(repoPath, workspace, handle.id);
88
+ executionStartTimes.set(execKey, Date.now());
89
+ }
90
+ /**
91
+ * Get the active execution for a workspace.
92
+ */
93
+ export function getActiveExecution(repoPath, workspace) {
94
+ const key = makeWorkspaceKey(repoPath, workspace);
95
+ return activeExecutions.get(key) ?? null;
96
+ }
97
+ /**
98
+ * Clear the active execution for a workspace.
99
+ */
100
+ export function clearActiveExecution(repoPath, workspace) {
101
+ const key = makeWorkspaceKey(repoPath, workspace);
102
+ const handle = activeExecutions.get(key);
103
+ if (handle) {
104
+ const execKey = makeExecutionKey(repoPath, workspace, handle.id);
105
+ executionStartTimes.delete(execKey);
106
+ }
107
+ activeExecutions.delete(key);
108
+ }
109
+ /**
110
+ * Check if there's an active (running) execution for a workspace.
111
+ */
112
+ export function hasActiveExecution(repoPath, workspace) {
113
+ return activeExecutions.has(makeWorkspaceKey(repoPath, workspace));
114
+ }
115
+ /**
116
+ * Get the start time for an execution (for duration calculation).
117
+ */
118
+ export function getExecutionStartTime(repoPath, workspace, executionId) {
119
+ const key = makeExecutionKey(repoPath, workspace, executionId);
120
+ return executionStartTimes.get(key) ?? null;
121
+ }
122
+ /**
123
+ * Get the latest execution for a workspace (may not be active/running).
124
+ * Useful for polling completed executions.
125
+ */
126
+ export async function getLatestExecution(repoPath, workspace) {
127
+ // First check for active execution
128
+ const active = getActiveExecution(repoPath, workspace);
129
+ if (active) {
130
+ return active;
131
+ }
132
+ // Otherwise check state store for latest
133
+ const stateStore = getOrCreateStateStore(repoPath);
134
+ const state = await stateStore.readLatest(repoPath, workspace);
135
+ if (state) {
136
+ return { id: state.id, repo: repoPath, workspace };
137
+ }
138
+ return null;
139
+ }
140
+ /**
141
+ * Clear all in-memory state (for testing).
142
+ * Note: This does not clear persisted file-based state.
143
+ */
144
+ export function clearAll() {
145
+ activeExecutions.clear();
146
+ executionStartTimes.clear();
147
+ stateStores.clear();
148
+ orchestrators.clear();
149
+ }
150
+ //# sourceMappingURL=orchestrator-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator-manager.js","sourceRoot":"","sources":["../../src/orchestrator-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
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 { type StorageBackend, type TransferBackend } from '@elaraai/e3-core';
7
+ /**
8
+ * Create generic upload/download data endpoints.
9
+ *
10
+ * Returns two Hono apps:
11
+ * - `uploads`: PUT /:id — upload data (dataset BEAST2 or package zip)
12
+ * - `downloads`: GET /:id — download data (dataset BEAST2 or package zip)
13
+ *
14
+ * These are unauthenticated — the UUID in the URL is the sole capability.
15
+ * In cloud deployments, these map directly to S3 presigned URLs.
16
+ */
17
+ export declare function createDataEndpoints(transferBackend: TransferBackend, storage: StorageBackend, getRepoPath: (repo: string) => string): {
18
+ uploads: Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
19
+ downloads: Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
20
+ };
21
+ //# sourceMappingURL=data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../../src/routes/data.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAK5B,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,eAAe,EACrB,MAAM,kBAAkB,CAAC;AAoB1B;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,eAAe,EAChC,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM;;;EAiGtC"}
@@ -0,0 +1,125 @@
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 { mkdir, writeFile, readFile, unlink } from 'node:fs/promises';
7
+ import { join } from 'node:path';
8
+ import { tmpdir } from 'node:os';
9
+ import { NullType, variant } from '@elaraai/east';
10
+ import { BEAST2_CONTENT_TYPE, ObjectNotFoundError, } from '@elaraai/e3-core';
11
+ import { sendError } from '../beast2.js';
12
+ const STAGING_DIR = join(tmpdir(), 'e3-transfers');
13
+ /**
14
+ * Reject requests that carry an Authorization header.
15
+ *
16
+ * Data endpoints are authenticated by the unguessable transfer UUID in the
17
+ * URL path (capability URL pattern). In cloud deployments these URLs are S3
18
+ * presigned URLs that reject extra auth headers, so the local server enforces
19
+ * the same contract.
20
+ */
21
+ function rejectAuthHeader(c) {
22
+ if (c.req.header('authorization')) {
23
+ return new Response('Authorization header must not be sent to data endpoints', { status: 400 });
24
+ }
25
+ return null;
26
+ }
27
+ /**
28
+ * Create generic upload/download data endpoints.
29
+ *
30
+ * Returns two Hono apps:
31
+ * - `uploads`: PUT /:id — upload data (dataset BEAST2 or package zip)
32
+ * - `downloads`: GET /:id — download data (dataset BEAST2 or package zip)
33
+ *
34
+ * These are unauthenticated — the UUID in the URL is the sole capability.
35
+ * In cloud deployments, these map directly to S3 presigned URLs.
36
+ */
37
+ export function createDataEndpoints(transferBackend, storage, getRepoPath) {
38
+ const uploads = new Hono();
39
+ const downloads = new Hono();
40
+ // PUT /api/uploads/:id — Upload data (dataset BEAST2 or package zip)
41
+ uploads.put('/:id', async (c) => {
42
+ const rejected = rejectAuthHeader(c);
43
+ if (rejected)
44
+ return rejected;
45
+ const id = c.req.param('id');
46
+ // Try dataset upload first
47
+ const dsRecord = await transferBackend.datasetUpload.get(id);
48
+ if (dsRecord) {
49
+ const stagingPath = join(STAGING_DIR, `${id}.beast2.partial`);
50
+ const body = new Uint8Array(await c.req.arrayBuffer());
51
+ await mkdir(STAGING_DIR, { recursive: true });
52
+ await writeFile(stagingPath, body);
53
+ return new Response(null, { status: 200 });
54
+ }
55
+ // Try package import
56
+ const pkgRecord = await transferBackend.packageImport.get(id);
57
+ if (pkgRecord) {
58
+ const body = new Uint8Array(await c.req.arrayBuffer());
59
+ if (BigInt(body.byteLength) !== pkgRecord.size) {
60
+ await transferBackend.packageImport.delete(id);
61
+ return sendError(NullType, variant('internal', {
62
+ message: `size mismatch: expected ${pkgRecord.size}, got ${body.byteLength}`,
63
+ }));
64
+ }
65
+ const stagingPath = join(STAGING_DIR, `${id}.zip.partial`);
66
+ await mkdir(STAGING_DIR, { recursive: true });
67
+ await writeFile(stagingPath, body);
68
+ return new Response(null, { status: 200 });
69
+ }
70
+ return new Response('Not found', { status: 404 });
71
+ });
72
+ // GET /api/downloads/:id — Download data (dataset BEAST2 or package zip)
73
+ downloads.get('/:id', async (c) => {
74
+ const rejected = rejectAuthHeader(c);
75
+ if (rejected)
76
+ return rejected;
77
+ const id = c.req.param('id');
78
+ // Try dataset download
79
+ const dsRecord = await transferBackend.datasetDownload.get(id);
80
+ if (dsRecord) {
81
+ const repoPath = getRepoPath(dsRecord.repo);
82
+ try {
83
+ const data = await storage.objects.read(repoPath, dsRecord.hash);
84
+ await transferBackend.datasetDownload.delete(id);
85
+ return new Response(data, {
86
+ headers: {
87
+ 'Content-Type': BEAST2_CONTENT_TYPE,
88
+ 'Content-Length': String(data.byteLength),
89
+ 'X-Content-SHA256': dsRecord.hash,
90
+ },
91
+ });
92
+ }
93
+ catch (err) {
94
+ await transferBackend.datasetDownload.delete(id);
95
+ if (err instanceof ObjectNotFoundError) {
96
+ return new Response('Not found', { status: 404 });
97
+ }
98
+ throw err;
99
+ }
100
+ }
101
+ // Try package export
102
+ const pkgRecord = await transferBackend.packageExport.get(id);
103
+ if (pkgRecord && pkgRecord.status.type === 'completed') {
104
+ const stagingPath = join(STAGING_DIR, `${id}.zip`);
105
+ try {
106
+ const fileData = await readFile(stagingPath);
107
+ await unlink(stagingPath).catch(() => { });
108
+ await transferBackend.packageExport.delete(id);
109
+ return new Response(fileData, {
110
+ status: 200,
111
+ headers: {
112
+ 'Content-Type': 'application/zip',
113
+ 'Content-Length': String(fileData.byteLength),
114
+ },
115
+ });
116
+ }
117
+ catch {
118
+ return new Response('Not found', { status: 404 });
119
+ }
120
+ }
121
+ return new Response('Not found', { status: 404 });
122
+ });
123
+ return { uploads, downloads };
124
+ }
125
+ //# sourceMappingURL=data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.js","sourceRoot":"","sources":["../../../src/routes/data.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 createDatasetRoutes(repoPath: string): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
6
+ import type { StorageBackend, TransferBackend } from '@elaraai/e3-core';
7
+ export declare function createDatasetRoutes(storage: StorageBackend, getRepoPath: (repo: string) => string, transferBackend?: TransferBackend): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
7
8
  //# sourceMappingURL=datasets.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"datasets.d.ts","sourceRoot":"","sources":["../../../src/routes/datasets.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAa5B,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,8EA8FnD"}
1
+ {"version":3,"file":"datasets.d.ts","sourceRoot":"","sources":["../../../src/routes/datasets.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAWxE,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EACrC,eAAe,CAAC,EAAE,eAAe,8EA0ElC"}
@@ -3,95 +3,71 @@
3
3
  * Licensed under BSL 1.1. See LICENSE for details.
4
4
  */
5
5
  import { Hono } from 'hono';
6
- import { NullType, ArrayType, StringType, decodeBeast2 } from '@elaraai/east';
7
6
  import { urlPathToTreePath } from '@elaraai/e3-types';
8
- import { workspaceListTree, workspaceGetDatasetHash, workspaceSetDataset, objectRead, } from '@elaraai/e3-core';
9
- import { sendSuccess, sendError } from '../beast2.js';
10
- import { errorToVariant } from '../errors.js';
11
- import { extractWildcardPath } from '../utils.js';
12
- export function createDatasetRoutes(repoPath) {
7
+ import { listDatasets, listDatasetsRecursive, listDatasetsRecursivePaths, listDatasetsWithStatus, getDataset, getDatasetStatus, setDataset, } from '../handlers/datasets.js';
8
+ export function createDatasetRoutes(storage, getRepoPath, transferBackend) {
13
9
  const app = new Hono();
14
- // GET /list - List field names at root (e3 list <repo> <ws>)
15
- app.get('/list', async (c) => {
16
- try {
17
- const workspace = c.req.param('ws');
18
- if (!workspace) {
19
- return sendError(c, ArrayType(StringType), errorToVariant(new Error('Missing workspace parameter')));
20
- }
21
- const fields = await workspaceListTree(repoPath, workspace, []);
22
- return sendSuccess(c, ArrayType(StringType), fields);
23
- }
24
- catch (err) {
25
- return sendError(c, ArrayType(StringType), errorToVariant(err));
10
+ // GET /api/repos/:repo/workspaces/:ws/datasets - List root fields
11
+ app.get('/', async (c) => {
12
+ const repo = c.req.param('repo');
13
+ const repoPath = getRepoPath(repo);
14
+ const ws = c.req.param('ws');
15
+ const list = c.req.query('list') === 'true';
16
+ const recursive = c.req.query('recursive') === 'true';
17
+ const status = c.req.query('status') === 'true';
18
+ if (recursive && !list) {
19
+ return c.json({ error: 'recursive requires list=true' }, 400);
26
20
  }
21
+ if (list && recursive && status)
22
+ return listDatasetsRecursive(storage, repoPath, ws, []);
23
+ if (list && recursive)
24
+ return listDatasetsRecursivePaths(storage, repoPath, ws, []);
25
+ if (list && status)
26
+ return listDatasetsWithStatus(storage, repoPath, ws, []);
27
+ return listDatasets(storage, repoPath, ws, []);
27
28
  });
28
- // GET /list/* - List field names at path (e3 list <repo> <ws.path>)
29
- app.get('/list/*', async (c) => {
30
- try {
31
- const workspace = c.req.param('ws');
32
- if (!workspace) {
33
- return sendError(c, ArrayType(StringType), errorToVariant(new Error('Missing workspace parameter')));
34
- }
35
- const pathStr = extractWildcardPath(c.req.path, /^\/api\/workspaces\/[^/]+\/list\//);
36
- const treePath = urlPathToTreePath(pathStr);
37
- const fields = await workspaceListTree(repoPath, workspace, treePath);
38
- return sendSuccess(c, ArrayType(StringType), fields);
39
- }
40
- catch (err) {
41
- return sendError(c, ArrayType(StringType), errorToVariant(err));
29
+ // GET /api/repos/:repo/workspaces/:ws/datasets/* - Orthogonal query params
30
+ app.get('/*', async (c) => {
31
+ const repo = c.req.param('repo');
32
+ const repoPath = getRepoPath(repo);
33
+ const ws = c.req.param('ws');
34
+ // Extract the wildcard path (c.req.path is percent-encoded)
35
+ const fullPath = c.req.path;
36
+ const datasetsPrefix = `/api/repos/${encodeURIComponent(repo)}/workspaces/${encodeURIComponent(ws)}/datasets/`;
37
+ const pathStr = fullPath.startsWith(datasetsPrefix) ? fullPath.slice(datasetsPrefix.length) : '';
38
+ const treePath = urlPathToTreePath(pathStr);
39
+ const list = c.req.query('list') === 'true';
40
+ const recursive = c.req.query('recursive') === 'true';
41
+ const status = c.req.query('status') === 'true';
42
+ if (recursive && !list) {
43
+ return c.json({ error: 'recursive requires list=true' }, 400);
42
44
  }
45
+ if (list && recursive && status)
46
+ return listDatasetsRecursive(storage, repoPath, ws, treePath);
47
+ if (list && recursive)
48
+ return listDatasetsRecursivePaths(storage, repoPath, ws, treePath);
49
+ if (list && status)
50
+ return listDatasetsWithStatus(storage, repoPath, ws, treePath);
51
+ if (list)
52
+ return listDatasets(storage, repoPath, ws, treePath);
53
+ if (status)
54
+ return getDatasetStatus(storage, repoPath, ws, treePath);
55
+ return getDataset(storage, repoPath, ws, treePath, repo, c.req.url, transferBackend);
43
56
  });
44
- // GET /get/* - Get dataset value as raw BEAST2 (e3 get <repo> <ws.path>)
45
- app.get('/get/*', async (c) => {
46
- try {
47
- const workspace = c.req.param('ws');
48
- if (!workspace) {
49
- return sendError(c, NullType, errorToVariant(new Error('Missing workspace parameter')));
50
- }
51
- const pathStr = extractWildcardPath(c.req.path, /^\/api\/workspaces\/[^/]+\/get\//);
52
- const treePath = urlPathToTreePath(pathStr);
53
- if (treePath.length === 0) {
54
- return sendError(c, NullType, errorToVariant(new Error('Path required for get')));
55
- }
56
- const { refType, hash } = await workspaceGetDatasetHash(repoPath, workspace, treePath);
57
- if (refType === 'unassigned') {
58
- return sendError(c, NullType, errorToVariant(new Error('Dataset is unassigned (pending task output)')));
59
- }
60
- if (refType === 'null' || !hash) {
61
- return sendError(c, NullType, errorToVariant(new Error('Dataset is null')));
62
- }
63
- // Return raw BEAST2 bytes directly from object store
64
- const data = await objectRead(repoPath, hash);
65
- return new Response(data, {
66
- status: 200,
67
- headers: { 'Content-Type': 'application/beast2' },
68
- });
69
- }
70
- catch (err) {
71
- return sendError(c, NullType, errorToVariant(err));
72
- }
73
- });
74
- // PUT /set/* - Set dataset value from raw BEAST2 (e3 set <repo> <ws.path>)
75
- app.put('/set/*', async (c) => {
76
- try {
77
- const workspace = c.req.param('ws');
78
- if (!workspace) {
79
- return sendError(c, NullType, errorToVariant(new Error('Missing workspace parameter')));
80
- }
81
- const pathStr = extractWildcardPath(c.req.path, /^\/api\/workspaces\/[^/]+\/set\//);
82
- const treePath = urlPathToTreePath(pathStr);
83
- if (treePath.length === 0) {
84
- return sendError(c, NullType, errorToVariant(new Error('Path required for set')));
85
- }
86
- // Body is raw BEAST2 - decode to get type and value
87
- const buffer = await c.req.arrayBuffer();
88
- const { type, value } = decodeBeast2(new Uint8Array(buffer));
89
- await workspaceSetDataset(repoPath, workspace, treePath, value, type);
90
- return sendSuccess(c, NullType, null);
91
- }
92
- catch (err) {
93
- return sendError(c, NullType, errorToVariant(err));
94
- }
57
+ // PUT /api/repos/:repo/workspaces/:ws/datasets/* - Set dataset value
58
+ app.put('/*', async (c) => {
59
+ const repo = c.req.param('repo');
60
+ const repoPath = getRepoPath(repo);
61
+ const ws = c.req.param('ws');
62
+ // Extract the wildcard path (c.req.path is percent-encoded)
63
+ const fullPath = c.req.path;
64
+ const datasetsPrefix = `/api/repos/${encodeURIComponent(repo)}/workspaces/${encodeURIComponent(ws)}/datasets/`;
65
+ const pathStr = fullPath.startsWith(datasetsPrefix) ? fullPath.slice(datasetsPrefix.length) : '';
66
+ const treePath = urlPathToTreePath(pathStr);
67
+ // Body is raw BEAST2
68
+ const buffer = await c.req.arrayBuffer();
69
+ const body = new Uint8Array(buffer);
70
+ return setDataset(storage, repoPath, ws, treePath, body);
95
71
  });
96
72
  return app;
97
73
  }
@@ -1 +1 @@
1
- {"version":3,"file":"datasets.js","sourceRoot":"","sources":["../../../src/routes/datasets.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"datasets.js","sourceRoot":"","sources":["../../../src/routes/datasets.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 createExecutionRoutes(repoPath: string): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
6
+ import type { StorageBackend } from '@elaraai/e3-core';
7
+ export declare function createExecutionRoutes(storage: StorageBackend, getRepoPath: (repo: string) => string): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
7
8
  //# sourceMappingURL=executions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"executions.d.ts","sourceRoot":"","sources":["../../../src/routes/executions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAgM5B,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,8EAgKrD"}
1
+ {"version":3,"file":"executions.d.ts","sourceRoot":"","sources":["../../../src/routes/executions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAYvD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,8EA2EtC"}