@elaraai/e3-api-server 1.0.79 → 1.0.80

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 (129) hide show
  1. package/README.md +83 -19
  2. package/dist/src/beast2.js +1 -1
  3. package/dist/src/beast2.js.map +1 -1
  4. package/dist/src/cli.js +13 -0
  5. package/dist/src/cli.js.map +1 -1
  6. package/dist/src/errors.d.ts.map +1 -1
  7. package/dist/src/errors.js +8 -1
  8. package/dist/src/errors.js.map +1 -1
  9. package/dist/src/handlers/dataflow.d.ts +58 -11
  10. package/dist/src/handlers/dataflow.d.ts.map +1 -1
  11. package/dist/src/handlers/dataflow.js +120 -48
  12. package/dist/src/handlers/dataflow.js.map +1 -1
  13. package/dist/src/handlers/dataflow.spec.d.ts +6 -0
  14. package/dist/src/handlers/dataflow.spec.d.ts.map +1 -0
  15. package/dist/src/handlers/dataflow.spec.js +106 -0
  16. package/dist/src/handlers/dataflow.spec.js.map +1 -0
  17. package/dist/src/handlers/datasets.d.ts +60 -34
  18. package/dist/src/handlers/datasets.d.ts.map +1 -1
  19. package/dist/src/handlers/datasets.js +452 -306
  20. package/dist/src/handlers/datasets.js.map +1 -1
  21. package/dist/src/handlers/datasets.spec.js +338 -119
  22. package/dist/src/handlers/datasets.spec.js.map +1 -1
  23. package/dist/src/handlers/functions.d.ts.map +1 -1
  24. package/dist/src/handlers/functions.js +10 -8
  25. package/dist/src/handlers/functions.js.map +1 -1
  26. package/dist/src/handlers/functions.spec.js +2 -2
  27. package/dist/src/handlers/functions.spec.js.map +1 -1
  28. package/dist/src/handlers/index.d.ts +2 -2
  29. package/dist/src/handlers/index.d.ts.map +1 -1
  30. package/dist/src/handlers/index.js +2 -2
  31. package/dist/src/handlers/index.js.map +1 -1
  32. package/dist/src/handlers/records.d.ts.map +1 -1
  33. package/dist/src/handlers/records.js +15 -12
  34. package/dist/src/handlers/records.js.map +1 -1
  35. package/dist/src/handlers/records.spec.js +9 -5
  36. package/dist/src/handlers/records.spec.js.map +1 -1
  37. package/dist/src/handlers/repository.d.ts +59 -10
  38. package/dist/src/handlers/repository.d.ts.map +1 -1
  39. package/dist/src/handlers/repository.js +147 -40
  40. package/dist/src/handlers/repository.js.map +1 -1
  41. package/dist/src/handlers/tasks.d.ts +2 -1
  42. package/dist/src/handlers/tasks.d.ts.map +1 -1
  43. package/dist/src/handlers/tasks.js +31 -8
  44. package/dist/src/handlers/tasks.js.map +1 -1
  45. package/dist/src/handlers/tasks.spec.d.ts +6 -0
  46. package/dist/src/handlers/tasks.spec.d.ts.map +1 -0
  47. package/dist/src/handlers/tasks.spec.js +64 -0
  48. package/dist/src/handlers/tasks.spec.js.map +1 -0
  49. package/dist/src/handlers/workspaces.d.ts +44 -6
  50. package/dist/src/handlers/workspaces.d.ts.map +1 -1
  51. package/dist/src/handlers/workspaces.js +74 -40
  52. package/dist/src/handlers/workspaces.js.map +1 -1
  53. package/dist/src/handlers/workspaces.spec.d.ts +6 -0
  54. package/dist/src/handlers/workspaces.spec.d.ts.map +1 -0
  55. package/dist/src/handlers/workspaces.spec.js +164 -0
  56. package/dist/src/handlers/workspaces.spec.js.map +1 -0
  57. package/dist/src/index.d.ts +3 -0
  58. package/dist/src/index.d.ts.map +1 -1
  59. package/dist/src/index.js +7 -0
  60. package/dist/src/index.js.map +1 -1
  61. package/dist/src/local-dataflow.d.ts +14 -0
  62. package/dist/src/local-dataflow.d.ts.map +1 -0
  63. package/dist/src/local-dataflow.js +41 -0
  64. package/dist/src/local-dataflow.js.map +1 -0
  65. package/dist/src/middleware/repository.d.ts +39 -0
  66. package/dist/src/middleware/repository.d.ts.map +1 -0
  67. package/dist/src/middleware/repository.js +77 -0
  68. package/dist/src/middleware/repository.js.map +1 -0
  69. package/dist/src/routes/data.d.ts +2 -2
  70. package/dist/src/routes/data.d.ts.map +1 -1
  71. package/dist/src/routes/data.js +22 -45
  72. package/dist/src/routes/data.js.map +1 -1
  73. package/dist/src/routes/datasets.d.ts +0 -3
  74. package/dist/src/routes/datasets.d.ts.map +1 -1
  75. package/dist/src/routes/datasets.js +40 -8
  76. package/dist/src/routes/datasets.js.map +1 -1
  77. package/dist/src/routes/executions.d.ts +37 -2
  78. package/dist/src/routes/executions.d.ts.map +1 -1
  79. package/dist/src/routes/executions.js +21 -12
  80. package/dist/src/routes/executions.js.map +1 -1
  81. package/dist/src/routes/index.d.ts +2 -1
  82. package/dist/src/routes/index.d.ts.map +1 -1
  83. package/dist/src/routes/index.js +1 -0
  84. package/dist/src/routes/index.js.map +1 -1
  85. package/dist/src/routes/objects.d.ts +16 -2
  86. package/dist/src/routes/objects.d.ts.map +1 -1
  87. package/dist/src/routes/objects.js +34 -3
  88. package/dist/src/routes/objects.js.map +1 -1
  89. package/dist/src/routes/repositories.d.ts +26 -0
  90. package/dist/src/routes/repositories.d.ts.map +1 -0
  91. package/dist/src/routes/repositories.js +58 -0
  92. package/dist/src/routes/repositories.js.map +1 -0
  93. package/dist/src/routes/repositories.spec.d.ts +6 -0
  94. package/dist/src/routes/repositories.spec.d.ts.map +1 -0
  95. package/dist/src/routes/repositories.spec.js +77 -0
  96. package/dist/src/routes/repositories.spec.js.map +1 -0
  97. package/dist/src/routes/repository.d.ts +12 -2
  98. package/dist/src/routes/repository.d.ts.map +1 -1
  99. package/dist/src/routes/repository.js +24 -9
  100. package/dist/src/routes/repository.js.map +1 -1
  101. package/dist/src/routes/transfer.d.ts +11 -9
  102. package/dist/src/routes/transfer.d.ts.map +1 -1
  103. package/dist/src/routes/transfer.js +90 -115
  104. package/dist/src/routes/transfer.js.map +1 -1
  105. package/dist/src/routes/workspaces.d.ts +14 -1
  106. package/dist/src/routes/workspaces.d.ts.map +1 -1
  107. package/dist/src/routes/workspaces.js +57 -46
  108. package/dist/src/routes/workspaces.js.map +1 -1
  109. package/dist/src/server.d.ts +18 -6
  110. package/dist/src/server.d.ts.map +1 -1
  111. package/dist/src/server.js +55 -182
  112. package/dist/src/server.js.map +1 -1
  113. package/dist/src/server.spec.d.ts +6 -0
  114. package/dist/src/server.spec.d.ts.map +1 -0
  115. package/dist/src/server.spec.js +59 -0
  116. package/dist/src/server.spec.js.map +1 -0
  117. package/dist/src/types.d.ts +200 -16
  118. package/dist/src/types.d.ts.map +1 -1
  119. package/dist/src/types.js +5 -2
  120. package/dist/src/types.js.map +1 -1
  121. package/package.json +5 -5
  122. package/dist/src/async-operation-state.d.ts +0 -37
  123. package/dist/src/async-operation-state.d.ts.map +0 -1
  124. package/dist/src/async-operation-state.js +0 -118
  125. package/dist/src/async-operation-state.js.map +0 -1
  126. package/dist/src/orchestrator-manager.d.ts +0 -45
  127. package/dist/src/orchestrator-manager.d.ts.map +0 -1
  128. package/dist/src/orchestrator-manager.js +0 -150
  129. package/dist/src/orchestrator-manager.js.map +0 -1
@@ -2,23 +2,72 @@
2
2
  * Copyright (c) 2025 Elara AI Pty Ltd
3
3
  * Licensed under BSL 1.1. See LICENSE for details.
4
4
  */
5
- import type { StorageBackend } from '@elaraai/e3-core';
5
+ import { type GcRequest } from '@elaraai/e3-types';
6
+ import type { RepoGcStore, StorageBackend } from '@elaraai/e3-core';
7
+ /**
8
+ * The repositories a host keeps, by name.
9
+ *
10
+ * @param storage - Storage backend, whose `RepoStore` keeps the repositories
11
+ * @returns The response: the names, or the error
12
+ */
13
+ export declare function listRepositories(storage: StorageBackend): Promise<Response>;
14
+ /**
15
+ * Creates a repository, with its record naming this release and every
16
+ * upgrade this e3 knows, since a new repository is in their forms.
17
+ *
18
+ * @param storage - Storage backend, whose `RepoStore` keeps the repositories
19
+ * @param repo - The new repository's name
20
+ * @returns The response: 201 with its name; or the error, as for one that
21
+ * exists, or whose removal is still being cleaned up
22
+ */
23
+ export declare function createRepository(storage: StorageBackend, repo: string): Promise<Response>;
24
+ /**
25
+ * Removes a repository, resumably: it is marked `deleting` first, so the
26
+ * repository gate treats it as gone from then on, and a removal asked again
27
+ * answers at once; then its refs and its objects are deleted a batch at a
28
+ * time, and last the repository itself.
29
+ *
30
+ * @param storage - Storage backend, whose `RepoStore` keeps the repositories
31
+ * @param repo - The repository's name
32
+ * @returns The response: null once it is removed, or the error
33
+ */
34
+ export declare function removeRepository(storage: StorageBackend, repo: string): Promise<Response>;
6
35
  /**
7
36
  * Get repository status.
8
37
  */
9
38
  export declare function getStatus(storage: StorageBackend, repoPath: string): Promise<Response>;
10
39
  /**
11
- * Start garbage collection (async).
40
+ * The repository's record: the release of e3 that last wrote it, and the store
41
+ * upgrades it has had.
12
42
  *
13
- * Returns immediately with an executionId. GC runs in background.
14
- * Poll getGcStatus() for progress.
43
+ * @param storage - Storage backend
44
+ * @param repoPath - Repository identifier
45
+ * @returns The response: the record, or the error
15
46
  */
16
- export declare function startGc(storage: StorageBackend, repoPath: string, options: {
17
- dryRun: boolean;
18
- minAge?: number;
19
- }): Response;
47
+ export declare function getRecord(storage: StorageBackend, repoPath: string): Promise<Response>;
20
48
  /**
21
- * Get garbage collection status.
49
+ * Start garbage collection, as a job the client polls.
50
+ *
51
+ * @remarks
52
+ * gc takes as long as the repository is large, which outlasts a request. So it
53
+ * runs as a job, in the compute the store dispatches it to: a local server's
54
+ * own process, or a cloud's. A poll reads the job's status from the store,
55
+ * whichever instance answers it.
56
+ *
57
+ * @param repo - The repository's name, which the job is filed under
58
+ * @param request - What gc keeps, and whether it deletes
59
+ * @param gcStore - Where the job is filed, and dispatched from
60
+ * @returns The response: 202 with the job's id, or the error
61
+ */
62
+ export declare function startGc(repo: string, request: GcRequest, gcStore: RepoGcStore): Promise<Response>;
63
+ /**
64
+ * A gc job's status: still running, what gc did, or why it failed.
65
+ *
66
+ * @param gcStore - Where the job is filed
67
+ * @param repo - The repository's name
68
+ * @param executionId - The job's id
69
+ * @returns The response: the status, or the error when this repository started
70
+ * no such job
22
71
  */
23
- export declare function getGcStatus(executionId: string): Response;
72
+ export declare function getGcStatus(gcStore: RepoGcStore, repo: string, executionId: string): Promise<Response>;
24
73
  //# sourceMappingURL=repository.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/handlers/repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAgBvD;;GAEG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,QAAQ,CAAC,CAmBnB;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CACrB,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5C,QAAQ,CAuBV;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,CAezD"}
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/handlers/repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAwB,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AASpE;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,CAMjF;AAED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAkB/F;AAED;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAmC/F;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,QAAQ,CAAC,CAmBnB;AAED;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,QAAQ,CAAC,CAMnB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,OAAO,CAC3B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,SAAS,EAClB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,QAAQ,CAAC,CAcnB;AAED;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,QAAQ,CAAC,CAYnB"}
@@ -2,12 +2,96 @@
2
2
  * Copyright (c) 2025 Elara AI Pty Ltd
3
3
  * Licensed under BSL 1.1. See LICENSE for details.
4
4
  */
5
- import { variant } from '@elaraai/east';
6
- import { repoGc, packageList, workspaceList } from '@elaraai/e3-core';
5
+ import { randomUUID } from 'node:crypto';
6
+ import { ArrayType, NullType, StringType, none, variant } from '@elaraai/east';
7
+ import { RepositoryRecordType } from '@elaraai/e3-types';
8
+ import { RepoAlreadyExistsError, RepoNotFoundError, packageList, repositoryOpen, workspaceList } from '@elaraai/e3-core';
7
9
  import { sendSuccess, sendSuccessWithStatus, sendError } from '../beast2.js';
8
10
  import { errorToVariant } from '../errors.js';
9
11
  import { RepositoryStatusType, GcStartResultType, GcStatusResultType, } from '../types.js';
10
- import { createGcOperation, completeGcOperation, failGcOperation, getGcOperationStatus, hasGcOperation, } from '../async-operation-state.js';
12
+ /**
13
+ * The repositories a host keeps, by name.
14
+ *
15
+ * @param storage - Storage backend, whose `RepoStore` keeps the repositories
16
+ * @returns The response: the names, or the error
17
+ */
18
+ export async function listRepositories(storage) {
19
+ try {
20
+ return sendSuccess(ArrayType(StringType), await storage.repos.list());
21
+ }
22
+ catch (err) {
23
+ return sendError(ArrayType(StringType), errorToVariant(err));
24
+ }
25
+ }
26
+ /**
27
+ * Creates a repository, with its record naming this release and every
28
+ * upgrade this e3 knows, since a new repository is in their forms.
29
+ *
30
+ * @param storage - Storage backend, whose `RepoStore` keeps the repositories
31
+ * @param repo - The new repository's name
32
+ * @returns The response: 201 with its name; or the error, as for one that
33
+ * exists, or whose removal is still being cleaned up
34
+ */
35
+ export async function createRepository(storage, repo) {
36
+ try {
37
+ const existing = await storage.repos.getMetadata(repo);
38
+ if (existing) {
39
+ if (existing.status.type === 'deleting') {
40
+ return sendError(StringType, variant('internal', { message: `Repository '${repo}' cleanup in progress, try later` }));
41
+ }
42
+ return sendError(StringType, variant('internal', { message: `Repository '${repo}' already exists` }));
43
+ }
44
+ await storage.repos.create(repo);
45
+ return sendSuccessWithStatus(StringType, repo, 201);
46
+ }
47
+ catch (err) {
48
+ if (err instanceof RepoAlreadyExistsError) {
49
+ return sendError(StringType, variant('internal', { message: `Repository '${repo}' already exists` }));
50
+ }
51
+ return sendError(StringType, errorToVariant(err));
52
+ }
53
+ }
54
+ /**
55
+ * Removes a repository, resumably: it is marked `deleting` first, so the
56
+ * repository gate treats it as gone from then on, and a removal asked again
57
+ * answers at once; then its refs and its objects are deleted a batch at a
58
+ * time, and last the repository itself.
59
+ *
60
+ * @param storage - Storage backend, whose `RepoStore` keeps the repositories
61
+ * @param repo - The repository's name
62
+ * @returns The response: null once it is removed, or the error
63
+ */
64
+ export async function removeRepository(storage, repo) {
65
+ try {
66
+ const existing = await storage.repos.getMetadata(repo);
67
+ if (!existing) {
68
+ return sendError(NullType, variant('repository_not_found', { repo }));
69
+ }
70
+ // Being removed already: the removal that marked it finishes it.
71
+ if (existing.status.type === 'deleting') {
72
+ return sendSuccess(NullType, null);
73
+ }
74
+ await storage.repos.setStatus(repo, 'deleting', 'active');
75
+ let cursor;
76
+ do {
77
+ const result = await storage.repos.deleteRefsBatch(repo, cursor);
78
+ cursor = result.status === 'continue' ? result.cursor : undefined;
79
+ } while (cursor);
80
+ cursor = undefined;
81
+ do {
82
+ const result = await storage.repos.deleteObjectsBatch(repo, cursor);
83
+ cursor = result.status === 'continue' ? result.cursor : undefined;
84
+ } while (cursor);
85
+ await storage.repos.remove(repo);
86
+ return sendSuccess(NullType, null);
87
+ }
88
+ catch (err) {
89
+ if (err instanceof RepoNotFoundError) {
90
+ return sendError(NullType, variant('repository_not_found', { repo }));
91
+ }
92
+ return sendError(NullType, errorToVariant(err));
93
+ }
94
+ }
11
95
  /**
12
96
  * Get repository status.
13
97
  */
@@ -31,49 +115,72 @@ export async function getStatus(storage, repoPath) {
31
115
  }
32
116
  }
33
117
  /**
34
- * Start garbage collection (async).
118
+ * The repository's record: the release of e3 that last wrote it, and the store
119
+ * upgrades it has had.
35
120
  *
36
- * Returns immediately with an executionId. GC runs in background.
37
- * Poll getGcStatus() for progress.
121
+ * @param storage - Storage backend
122
+ * @param repoPath - Repository identifier
123
+ * @returns The response: the record, or the error
38
124
  */
39
- export function startGc(storage, repoPath, options) {
40
- // Create operation and get executionId
41
- const executionId = createGcOperation();
42
- // Run GC in background (don't await)
43
- void (async () => {
44
- try {
45
- const result = await repoGc(storage, repoPath, options);
46
- completeGcOperation(executionId, {
47
- deletedObjects: BigInt(result.deletedObjects),
48
- deletedPartials: BigInt(result.deletedPartials),
49
- retainedObjects: BigInt(result.retainedObjects),
50
- skippedYoung: BigInt(result.skippedYoung),
51
- bytesFreed: BigInt(result.bytesFreed),
52
- });
53
- }
54
- catch (err) {
55
- const message = err instanceof Error ? err.message : String(err);
56
- failGcOperation(executionId, message);
57
- }
58
- })();
59
- // Return 202 Accepted with executionId
60
- return sendSuccessWithStatus(GcStartResultType, { executionId }, 202);
125
+ export async function getRecord(storage, repoPath) {
126
+ try {
127
+ return sendSuccess(RepositoryRecordType, await repositoryOpen(storage, repoPath));
128
+ }
129
+ catch (err) {
130
+ return sendError(RepositoryRecordType, errorToVariant(err));
131
+ }
132
+ }
133
+ /**
134
+ * Start garbage collection, as a job the client polls.
135
+ *
136
+ * @remarks
137
+ * gc takes as long as the repository is large, which outlasts a request. So it
138
+ * runs as a job, in the compute the store dispatches it to: a local server's
139
+ * own process, or a cloud's. A poll reads the job's status from the store,
140
+ * whichever instance answers it.
141
+ *
142
+ * @param repo - The repository's name, which the job is filed under
143
+ * @param request - What gc keeps, and whether it deletes
144
+ * @param gcStore - Where the job is filed, and dispatched from
145
+ * @returns The response: 202 with the job's id, or the error
146
+ */
147
+ export async function startGc(repo, request, gcStore) {
148
+ try {
149
+ const executionId = randomUUID();
150
+ await gcStore.create(executionId, {
151
+ repo,
152
+ request,
153
+ status: { status: variant('running', null), stats: none, error: none },
154
+ createdAt: new Date(),
155
+ });
156
+ await gcStore.execute(executionId, repo);
157
+ return sendSuccessWithStatus(GcStartResultType, { executionId }, 202);
158
+ }
159
+ catch (err) {
160
+ return sendError(GcStartResultType, errorToVariant(err));
161
+ }
61
162
  }
62
163
  /**
63
- * Get garbage collection status.
164
+ * A gc job's status: still running, what gc did, or why it failed.
165
+ *
166
+ * @param gcStore - Where the job is filed
167
+ * @param repo - The repository's name
168
+ * @param executionId - The job's id
169
+ * @returns The response: the status, or the error when this repository started
170
+ * no such job
64
171
  */
65
- export function getGcStatus(executionId) {
66
- if (!hasGcOperation(executionId)) {
67
- return sendError(GcStatusResultType, variant('internal', {
68
- message: `GC operation not found: ${executionId}`,
69
- }));
172
+ export async function getGcStatus(gcStore, repo, executionId) {
173
+ try {
174
+ const job = await gcStore.get(executionId);
175
+ if (job === null || job.repo !== repo) {
176
+ return sendError(GcStatusResultType, variant('internal', {
177
+ message: `repository '${repo}' has no gc job '${executionId}'`,
178
+ }));
179
+ }
180
+ return sendSuccess(GcStatusResultType, job.status);
70
181
  }
71
- const status = getGcOperationStatus(executionId);
72
- if (!status) {
73
- return sendError(GcStatusResultType, variant('internal', {
74
- message: `GC operation not found: ${executionId}`,
75
- }));
182
+ catch (err) {
183
+ return sendError(GcStatusResultType, errorToVariant(err));
76
184
  }
77
- return sendSuccess(GcStatusResultType, status);
78
185
  }
79
186
  //# sourceMappingURL=repository.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/handlers/repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtE,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,oBAAoB,EACpB,cAAc,GACf,MAAM,6BAA6B,CAAC;AAErC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,OAAuB,EACvB,QAAgB;IAEhB,IAAI,CAAC;QACH,gBAAgB;QAChB,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAE1D,gCAAgC;QAChC,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAE1D,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC;YAChC,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACrC,cAAc,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;SAC1C,CAAC;QACF,OAAO,WAAW,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,SAAS,CAAC,oBAAoB,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CACrB,OAAuB,EACvB,QAAgB,EAChB,OAA6C;IAE7C,uCAAuC;IACvC,MAAM,WAAW,GAAG,iBAAiB,EAAE,CAAC;IAExC,qCAAqC;IACrC,KAAK,CAAC,KAAK,IAAI,EAAE;QACf,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YACxD,mBAAmB,CAAC,WAAW,EAAE;gBAC/B,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC;gBAC7C,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC;gBAC/C,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC;gBAC/C,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;gBACzC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;aACtC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,eAAe,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,uCAAuC;IACvC,OAAO,qBAAqB,CAAC,iBAAiB,EAAE,EAAE,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC;AACxE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,WAAmB;IAC7C,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC;QACjC,OAAO,SAAS,CAAC,kBAAkB,EAAE,OAAO,CAAC,UAAU,EAAE;YACvD,OAAO,EAAE,2BAA2B,WAAW,EAAE;SAClD,CAAC,CAAC,CAAC;IACN,CAAC;IAED,MAAM,MAAM,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC,kBAAkB,EAAE,OAAO,CAAC,UAAU,EAAE;YACvD,OAAO,EAAE,2BAA2B,WAAW,EAAE;SAClD,CAAC,CAAC,CAAC;IACN,CAAC;IAED,OAAO,WAAW,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;AACjD,CAAC"}
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/handlers/repository.ts"],"names":[],"mappings":"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"}
@@ -14,7 +14,8 @@ export declare function getTask(storage: StorageBackend, repoPath: string, works
14
14
  /**
15
15
  * List execution history for a task: the latest attempt per distinct
16
16
  * inputs hash, or — with `all` — every attempt (a forced re-run or a retry
17
- * after a failure adds one under the same inputs hash).
17
+ * after a failure adds one under the same inputs hash). A split task's units
18
+ * are recorded under its hash too, and are left out: they are not its runs.
18
19
  */
19
20
  export declare function listExecutions(storage: StorageBackend, repoPath: string, workspace: string, taskName: string, all?: boolean): Promise<Response>;
20
21
  //# sourceMappingURL=tasks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../../src/handlers/tasks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAKvD;;GAEG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,CAAC,CAiBnB;AAED;;GAEG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,QAAQ,CAAC,CAiBnB;AA0ED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,GAAG,UAAQ,GACV,OAAO,CAAC,QAAQ,CAAC,CAqBnB"}
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../../src/handlers/tasks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAKvD;;GAEG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,CAAC,CAiBnB;AAED;;GAEG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,QAAQ,CAAC,CAiBnB;AAgGD;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,GAAG,UAAQ,GACV,OAAO,CAAC,QAAQ,CAAC,CAqBnB"}
@@ -13,11 +13,11 @@ import { TaskListItemType, TaskDetailsType, ExecutionListItemType } from '../typ
13
13
  export async function listTasks(storage, repoPath, workspace) {
14
14
  try {
15
15
  const taskNames = await workspaceListTasks(storage, repoPath, workspace);
16
- // Get hash + kind for each task (the object read is content-addressed and cheap)
16
+ // Get hash + role for each task (the object read is content-addressed and cheap)
17
17
  const result = await Promise.all(taskNames.map(async (name) => {
18
18
  const hash = await workspaceGetTaskHash(storage, repoPath, workspace, name);
19
19
  const task = await workspaceGetTask(storage, repoPath, workspace, name);
20
- return { name, hash, kind: task.kind };
20
+ return { name, hash, role: task.role };
21
21
  }));
22
22
  return sendSuccess(ArrayType(TaskListItemType), result);
23
23
  }
@@ -35,11 +35,11 @@ export async function getTask(storage, repoPath, workspace, taskName) {
35
35
  return sendSuccess(TaskDetailsType, {
36
36
  name: taskName,
37
37
  hash,
38
- commandIr: task.commandIr,
38
+ body: task.body,
39
+ runner: task.runner,
39
40
  inputs: task.inputs,
40
41
  output: task.output,
41
- kind: task.kind,
42
- metadata: task.metadata,
42
+ role: task.role,
43
43
  });
44
44
  }
45
45
  catch (err) {
@@ -59,6 +59,10 @@ function statusToApiStatus(status) {
59
59
  return variant('failed', null);
60
60
  case 'error':
61
61
  return variant('error', null);
62
+ case 'cancelled':
63
+ return variant('cancelled', null);
64
+ case 'interrupted':
65
+ return variant('interrupted', null);
62
66
  }
63
67
  }
64
68
  /**
@@ -80,6 +84,7 @@ function toExecutionListItem(inputsHash, status) {
80
84
  completedAt: some(status.value.completedAt.toISOString()),
81
85
  duration: some(calculateDuration(status.value.startedAt, status.value.completedAt)),
82
86
  exitCode: none,
87
+ peakBytes: status.value.peakBytes,
83
88
  };
84
89
  }
85
90
  if (status.type === 'failed') {
@@ -91,9 +96,24 @@ function toExecutionListItem(inputsHash, status) {
91
96
  completedAt: some(status.value.completedAt.toISOString()),
92
97
  duration: some(calculateDuration(status.value.startedAt, status.value.completedAt)),
93
98
  exitCode: some(status.value.exitCode),
99
+ peakBytes: status.value.peakBytes,
94
100
  };
95
101
  }
96
- if (status.type === 'error') {
102
+ if (status.type === 'cancelled') {
103
+ return {
104
+ inputsHash,
105
+ inputHashes: status.value.inputHashes,
106
+ status: statusToApiStatus(status),
107
+ startedAt: status.value.startedAt.toISOString(),
108
+ completedAt: some(status.value.completedAt.toISOString()),
109
+ duration: some(calculateDuration(status.value.startedAt, status.value.completedAt)),
110
+ exitCode: none,
111
+ peakBytes: none,
112
+ };
113
+ }
114
+ // An interruption's completedAt is when it was found, not when the runner
115
+ // stopped, so it has no duration.
116
+ if (status.type === 'error' || status.type === 'interrupted') {
97
117
  return {
98
118
  inputsHash,
99
119
  inputHashes: status.value.inputHashes,
@@ -102,6 +122,7 @@ function toExecutionListItem(inputsHash, status) {
102
122
  completedAt: some(status.value.completedAt.toISOString()),
103
123
  duration: none,
104
124
  exitCode: none,
125
+ peakBytes: none,
105
126
  };
106
127
  }
107
128
  // running
@@ -113,12 +134,14 @@ function toExecutionListItem(inputsHash, status) {
113
134
  completedAt: none,
114
135
  duration: none,
115
136
  exitCode: none,
137
+ peakBytes: none,
116
138
  };
117
139
  }
118
140
  /**
119
141
  * List execution history for a task: the latest attempt per distinct
120
142
  * inputs hash, or — with `all` — every attempt (a forced re-run or a retry
121
- * after a failure adds one under the same inputs hash).
143
+ * after a failure adds one under the same inputs hash). A split task's units
144
+ * are recorded under its hash too, and are left out: they are not its runs.
122
145
  */
123
146
  export async function listExecutions(storage, repoPath, workspace, taskName, all = false) {
124
147
  try {
@@ -131,7 +154,7 @@ export async function listExecutions(storage, repoPath, workspace, taskName, all
131
154
  .map(executionId => executionGet(storage, repoPath, taskHash, inputsHash, executionId)))
132
155
  : [await executionGetLatest(storage, repoPath, taskHash, inputsHash)];
133
156
  for (const status of statuses) {
134
- if (status)
157
+ if (status && !status.value.unit)
135
158
  result.push(toExecutionListItem(inputsHash, status));
136
159
  }
137
160
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../../src/handlers/tasks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../../src/handlers/tasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=tasks.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.spec.d.ts","sourceRoot":"","sources":["../../../src/handlers/tasks.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ /**
6
+ * Task route tests: a task's execution history lists its runs, and leaves out
7
+ * the units a split task runs under its hash, which are not runs of it.
8
+ */
9
+ import { describe, it, beforeEach } from 'node:test';
10
+ import assert from 'node:assert/strict';
11
+ import { Hono } from 'hono';
12
+ import { ArrayType, decodeBeast2For, encodeBeast2For, none, some, variant } from '@elaraai/east';
13
+ import { InMemoryStorage } from '@elaraai/e3-core/test';
14
+ import { PackageObjectType, WorkspaceRecordType } from '@elaraai/e3-types';
15
+ import { createTaskRoutes } from '../routes/tasks.js';
16
+ import { ExecutionListItemType, ResponseType } from '../types.js';
17
+ const REPO = 'test-repo';
18
+ const WS = 'main';
19
+ const TASK = 'a'.repeat(64);
20
+ const decodeHistory = decodeBeast2For(ResponseType(ArrayType(ExecutionListItemType)));
21
+ describe('task routes', () => {
22
+ let storage;
23
+ let app;
24
+ beforeEach(async () => {
25
+ storage = new InMemoryStorage();
26
+ await storage.repos.create(REPO);
27
+ const pkg = await storage.objects.write(REPO, encodeBeast2For(PackageObjectType)({
28
+ tasks: new Map([['count', TASK]]),
29
+ data: { structure: variant('struct', new Map()), refs: new Map() },
30
+ functions: new Map(),
31
+ records: new Map(),
32
+ sources: new Map(),
33
+ }));
34
+ await storage.refs.workspaceWrite(REPO, WS, encodeBeast2For(WorkspaceRecordType)(some({
35
+ packageName: 'counts', packageVersion: '1.0.0', packageHash: pkg, deployedAt: new Date(0), currentRunId: none,
36
+ })));
37
+ app = new Hono();
38
+ app.route('/api/repos/:repo/workspaces/:ws/tasks', createTaskRoutes(storage, () => REPO));
39
+ });
40
+ /** The inputs hash of each execution the task's history lists. */
41
+ async function history(query = '') {
42
+ const response = await app.request(`/api/repos/r/workspaces/${WS}/tasks/count/executions${query}`);
43
+ const answer = decodeHistory(new Uint8Array(await response.arrayBuffer()));
44
+ if (answer.type !== 'success')
45
+ assert.fail(`the history was refused: ${answer.value.type}`);
46
+ return answer.value.map((item) => item.inputsHash);
47
+ }
48
+ it('lists a split task\'s runs, and none of the units it ran under its hash', async () => {
49
+ // Two runs of the task over the same inputs, and a piece and a merge of
50
+ // the second, each under inputs of its own.
51
+ const own = 'b'.repeat(64);
52
+ const executions = [[own, false], [own, false], ['c'.repeat(64), true], ['d'.repeat(64), true]];
53
+ for (const [i, [inputs, unit]] of executions.entries()) {
54
+ const executionId = `01900000-0000-7000-8000-00000000000${i + 1}`;
55
+ await storage.refs.executionWrite(REPO, TASK, inputs, executionId, variant('success', {
56
+ executionId, inputHashes: [], outputHash: 'f'.repeat(64),
57
+ startedAt: new Date(0), completedAt: new Date(1_000), peakBytes: none, plan: none, unit,
58
+ }));
59
+ }
60
+ assert.deepEqual(await history(), [own]);
61
+ assert.deepEqual(await history('?all=true'), [own, own]);
62
+ });
63
+ });
64
+ //# sourceMappingURL=tasks.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.spec.js","sourceRoot":"","sources":["../../../src/handlers/tasks.spec.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,8 @@
2
2
  * Copyright (c) 2025 Elara AI Pty Ltd
3
3
  * Licensed under BSL 1.1. See LICENSE for details.
4
4
  */
5
- import type { StorageBackend } from '@elaraai/e3-core';
5
+ import { type WorkspaceDeployRequest } from '@elaraai/e3-types';
6
+ import type { StorageBackend, TaskRunner, WorkspaceDeployStore } from '@elaraai/e3-core';
6
7
  /**
7
8
  * List all workspaces in the repository.
8
9
  */
@@ -17,18 +18,55 @@ export declare function createWorkspace(storage: StorageBackend, repoPath: strin
17
18
  export declare function getWorkspace(storage: StorageBackend, repoPath: string, name: string): Promise<Response>;
18
19
  /**
19
20
  * Get comprehensive workspace status.
21
+ *
22
+ * @param storage - Storage backend
23
+ * @param runner - The runner the repository's tasks run on, which says
24
+ * whether an execution recorded running can still finish
25
+ * @param repoPath - Repository identifier
26
+ * @param name - Workspace name
27
+ * @returns The response: the status, or the error
20
28
  */
21
- export declare function getWorkspaceStatus(storage: StorageBackend, repoPath: string, name: string): Promise<Response>;
29
+ export declare function getWorkspaceStatus(storage: StorageBackend, runner: TaskRunner, repoPath: string, name: string): Promise<Response>;
22
30
  /**
23
31
  * Delete a workspace.
24
32
  */
25
33
  export declare function deleteWorkspace(storage: StorageBackend, repoPath: string, name: string): Promise<Response>;
26
34
  /**
27
- * Deploy a package to a workspace.
35
+ * Start deploying a package to a workspace, as a job the client polls.
36
+ *
37
+ * @remarks
38
+ * A deploy that migrates a record, or builds an index over one, takes as long
39
+ * as the record is large, which outlasts a request. So the deploy runs as a
40
+ * job, in the compute the store dispatches it to: a local server's own
41
+ * process, or a cloud's. The package is resolved first, so a deploy of one the
42
+ * repository does not hold is refused at once, as `package_not_found`, and the
43
+ * job deploys exactly the version resolved.
44
+ *
45
+ * The job never opens a path-initialised input's file: its path is on the
46
+ * machine that exported the package. Each such input is left unassigned, and
47
+ * `e3 workspace deploy <url>` completes it over the dataset transfer protocol
48
+ * once the job has finished.
49
+ *
50
+ * @param storage - Storage backend
51
+ * @param repoPath - Repository identifier
52
+ * @param repo - The repository's name, which the job is filed under
53
+ * @param workspace - Workspace name
54
+ * @param request - The package, and what the deploy does with a record it
55
+ * cannot keep as it is
56
+ * @param deployStore - Where the job is filed, and dispatched from
57
+ * @returns The response: the job's id, or the error
28
58
  */
29
- export declare function deployWorkspace(storage: StorageBackend, repoPath: string, workspace: string, packageRef: string): Promise<Response>;
59
+ export declare function startWorkspaceDeploy(storage: StorageBackend, repoPath: string, repo: string, workspace: string, request: WorkspaceDeployRequest, deployStore: WorkspaceDeployStore): Promise<Response>;
30
60
  /**
31
- * Export a workspace as a zip archive.
61
+ * A deploy job's status: still running, what the deploy did, or why it did
62
+ * not.
63
+ *
64
+ * @param deployStore - Where the job is filed
65
+ * @param repo - The repository's name
66
+ * @param workspace - Workspace name
67
+ * @param id - The job's id
68
+ * @returns The response: the status, or the error when this workspace started
69
+ * no such job
32
70
  */
33
- export declare function exportWorkspace(storage: StorageBackend, repoPath: string, workspace: string): Promise<Response>;
71
+ export declare function getWorkspaceDeployStatus(deployStore: WorkspaceDeployStore, repo: string, workspace: string, id: string): Promise<Response>;
34
72
  //# sourceMappingURL=workspaces.d.ts.map