@elaraai/e3-api-server 1.0.79 → 1.0.81

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 +100 -20
  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 +63 -6
  50. package/dist/src/handlers/workspaces.d.ts.map +1 -1
  51. package/dist/src/handlers/workspaces.js +104 -42
  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 +214 -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 +22 -10
  102. package/dist/src/routes/transfer.d.ts.map +1 -1
  103. package/dist/src/routes/transfer.js +104 -118
  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 +64 -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 +57 -183
  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 +306 -17
  118. package/dist/src/types.d.ts.map +1 -1
  119. package/dist/src/types.js +7 -3
  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,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
  */
@@ -13,22 +14,78 @@ export declare function listWorkspaces(storage: StorageBackend, repoPath: string
13
14
  export declare function createWorkspace(storage: StorageBackend, repoPath: string, name: string): Promise<Response>;
14
15
  /**
15
16
  * Get workspace state.
17
+ *
18
+ * @param storage - Storage backend
19
+ * @param repoPath - Repository identifier
20
+ * @param name - Workspace name
21
+ * @returns The response: the deployed state; `workspace_not_deployed` for a
22
+ * workspace nothing is deployed to yet, as while its first deploy runs; or
23
+ * `workspace_not_found`
16
24
  */
17
25
  export declare function getWorkspace(storage: StorageBackend, repoPath: string, name: string): Promise<Response>;
26
+ /**
27
+ * What holds a workspace exclusively, and how far that operation says it has
28
+ * got: a deploy taking its file sources in and deploying its records, while a
29
+ * workspace deployed for the first time has no status to show.
30
+ *
31
+ * @param storage - Storage backend
32
+ * @param repoPath - Repository identifier
33
+ * @param name - Workspace name
34
+ * @returns The response: the lock's status, `none` when nothing holds the
35
+ * workspace exclusively, or the error
36
+ */
37
+ export declare function getWorkspaceLockStatus(storage: StorageBackend, repoPath: string, name: string): Promise<Response>;
18
38
  /**
19
39
  * Get comprehensive workspace status.
40
+ *
41
+ * @param storage - Storage backend
42
+ * @param runner - The runner the repository's tasks run on, which says
43
+ * whether an execution recorded running can still finish
44
+ * @param repoPath - Repository identifier
45
+ * @param name - Workspace name
46
+ * @returns The response: the status, or the error
20
47
  */
21
- export declare function getWorkspaceStatus(storage: StorageBackend, repoPath: string, name: string): Promise<Response>;
48
+ export declare function getWorkspaceStatus(storage: StorageBackend, runner: TaskRunner, repoPath: string, name: string): Promise<Response>;
22
49
  /**
23
50
  * Delete a workspace.
24
51
  */
25
52
  export declare function deleteWorkspace(storage: StorageBackend, repoPath: string, name: string): Promise<Response>;
26
53
  /**
27
- * Deploy a package to a workspace.
54
+ * Start deploying a package to a workspace, as a job the client polls.
55
+ *
56
+ * @remarks
57
+ * A deploy that migrates a record, or builds an index over one, takes as long
58
+ * as the record is large, which outlasts a request. So the deploy runs as a
59
+ * job, in the compute the store dispatches it to: a local server's own
60
+ * process, or a cloud's. The package is resolved first, so a deploy of one the
61
+ * repository does not hold is refused at once, as `package_not_found`, and the
62
+ * job deploys exactly the version resolved.
63
+ *
64
+ * The job never opens a path-initialised input's file: its path is on the
65
+ * machine that exported the package. Each such input is left unassigned, and
66
+ * `e3 workspace deploy <url>` completes it over the dataset transfer protocol
67
+ * once the job has finished.
68
+ *
69
+ * @param storage - Storage backend
70
+ * @param repoPath - Repository identifier
71
+ * @param repo - The repository's name, which the job is filed under
72
+ * @param workspace - Workspace name
73
+ * @param request - The package, and what the deploy does with a record it
74
+ * cannot keep as it is
75
+ * @param deployStore - Where the job is filed, and dispatched from
76
+ * @returns The response: the job's id, or the error
28
77
  */
29
- export declare function deployWorkspace(storage: StorageBackend, repoPath: string, workspace: string, packageRef: string): Promise<Response>;
78
+ export declare function startWorkspaceDeploy(storage: StorageBackend, repoPath: string, repo: string, workspace: string, request: WorkspaceDeployRequest, deployStore: WorkspaceDeployStore): Promise<Response>;
30
79
  /**
31
- * Export a workspace as a zip archive.
80
+ * A deploy job's status: still running, what the deploy did, or why it did
81
+ * not.
82
+ *
83
+ * @param deployStore - Where the job is filed
84
+ * @param repo - The repository's name
85
+ * @param workspace - Workspace name
86
+ * @param id - The job's id
87
+ * @returns The response: the status, or the error when this workspace started
88
+ * no such job
32
89
  */
33
- export declare function exportWorkspace(storage: StorageBackend, repoPath: string, workspace: string): Promise<Response>;
90
+ export declare function getWorkspaceDeployStatus(deployStore: WorkspaceDeployStore, repo: string, workspace: string, id: string): Promise<Response>;
34
91
  //# sourceMappingURL=workspaces.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"workspaces.d.ts","sourceRoot":"","sources":["../../../src/handlers/workspaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkBH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAKvD;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,QAAQ,CAAC,CA2BnB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,CAAC,CAYnB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,CAAC,CAUnB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,CAAC,CAkDnB;AA8CD;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,CAAC,CAOnB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,QAAQ,CAAC,CAuBnB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,CAAC,CAenB"}
1
+ {"version":3,"file":"workspaces.d.ts","sourceRoot":"","sources":["../../../src/handlers/workspaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EACmF,KAAK,sBAAsB,EACpH,MAAM,mBAAmB,CAAC;AAc3B,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAKzF;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,QAAQ,CAAC,CA2BnB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,CAAC,CAYnB;AAED;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,CAAC,CAWnB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,CAAC,CAOnB;AAED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,CAAC,CAmDnB;AA8CD;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,CAAC,CAOnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,sBAAsB,EAC/B,WAAW,EAAE,oBAAoB,GAChC,OAAO,CAAC,QAAQ,CAAC,CAwBnB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,wBAAwB,CAC5C,WAAW,EAAE,oBAAoB,EACjC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,QAAQ,CAAC,CAYnB"}
@@ -2,16 +2,14 @@
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
- import { BlobType, NullType, some, none, variant } from '@elaraai/east';
5
+ import { randomUUID } from 'node:crypto';
6
+ import { NullType, OptionType, some, none, variant } from '@elaraai/east';
9
7
  import { ArrayType } from '@elaraai/east';
10
- import { WorkspaceStateType, parsePackageRef } from '@elaraai/e3-types';
11
- import { workspaceList, workspaceCreate, workspaceRemove, workspaceGetState, workspaceDeploy, workspaceExport, workspaceStatus, packageGetLatestVersion, } from '@elaraai/e3-core';
8
+ import { PackageJobResponseType, WorkspaceDeployStatusType, WorkspaceStateType, parsePackageRef, } from '@elaraai/e3-types';
9
+ import { workspaceList, workspaceCreate, workspaceRemove, workspaceGetState, workspaceLockStatus, workspaceStatus, packageGetLatestVersion, packageResolve, PackageNotFoundError, WorkspaceNotDeployedError, WorkspaceNotFoundError, } from '@elaraai/e3-core';
12
10
  import { sendSuccess, sendError } from '../beast2.js';
13
11
  import { errorToVariant } from '../errors.js';
14
- import { WorkspaceInfoType, WorkspaceStatusResultType } from '../types.js';
12
+ import { LockStatusType, WorkspaceInfoType, WorkspaceStatusResultType } from '../types.js';
15
13
  /**
16
14
  * List all workspaces in the repository.
17
15
  */
@@ -62,12 +60,20 @@ export async function createWorkspace(storage, repoPath, name) {
62
60
  }
63
61
  /**
64
62
  * Get workspace state.
63
+ *
64
+ * @param storage - Storage backend
65
+ * @param repoPath - Repository identifier
66
+ * @param name - Workspace name
67
+ * @returns The response: the deployed state; `workspace_not_deployed` for a
68
+ * workspace nothing is deployed to yet, as while its first deploy runs; or
69
+ * `workspace_not_found`
65
70
  */
66
71
  export async function getWorkspace(storage, repoPath, name) {
67
72
  try {
68
73
  const state = await workspaceGetState(storage, repoPath, name);
69
74
  if (!state) {
70
- return sendError(WorkspaceStateType, errorToVariant(new Error(`Workspace '${name}' is not deployed`)));
75
+ const exists = (await workspaceList(storage, repoPath)).includes(name);
76
+ throw exists ? new WorkspaceNotDeployedError(name) : new WorkspaceNotFoundError(name);
71
77
  }
72
78
  return sendSuccess(WorkspaceStateType, state);
73
79
  }
@@ -75,12 +81,39 @@ export async function getWorkspace(storage, repoPath, name) {
75
81
  return sendError(WorkspaceStateType, errorToVariant(err));
76
82
  }
77
83
  }
84
+ /**
85
+ * What holds a workspace exclusively, and how far that operation says it has
86
+ * got: a deploy taking its file sources in and deploying its records, while a
87
+ * workspace deployed for the first time has no status to show.
88
+ *
89
+ * @param storage - Storage backend
90
+ * @param repoPath - Repository identifier
91
+ * @param name - Workspace name
92
+ * @returns The response: the lock's status, `none` when nothing holds the
93
+ * workspace exclusively, or the error
94
+ */
95
+ export async function getWorkspaceLockStatus(storage, repoPath, name) {
96
+ try {
97
+ const status = await workspaceLockStatus(storage, repoPath, name);
98
+ return sendSuccess(OptionType(LockStatusType), status === null ? none : some(status));
99
+ }
100
+ catch (err) {
101
+ return sendError(OptionType(LockStatusType), errorToVariant(err));
102
+ }
103
+ }
78
104
  /**
79
105
  * Get comprehensive workspace status.
106
+ *
107
+ * @param storage - Storage backend
108
+ * @param runner - The runner the repository's tasks run on, which says
109
+ * whether an execution recorded running can still finish
110
+ * @param repoPath - Repository identifier
111
+ * @param name - Workspace name
112
+ * @returns The response: the status, or the error
80
113
  */
81
- export async function getWorkspaceStatus(storage, repoPath, name) {
114
+ export async function getWorkspaceStatus(storage, runner, repoPath, name) {
82
115
  try {
83
- const status = await workspaceStatus(storage, repoPath, name);
116
+ const status = await workspaceStatus(storage, runner, repoPath, name);
84
117
  // Convert numbers to bigints for BEAST2 serialization
85
118
  const result = {
86
119
  workspace: status.workspace,
@@ -104,6 +137,7 @@ export async function getWorkspaceStatus(storage, repoPath, name) {
104
137
  inputs: t.inputs,
105
138
  output: t.output,
106
139
  dependsOn: t.dependsOn,
140
+ peakBytes: t.peakBytes === null ? none : some(BigInt(t.peakBytes)),
107
141
  })),
108
142
  summary: {
109
143
  datasets: {
@@ -185,51 +219,79 @@ export async function deleteWorkspace(storage, repoPath, name) {
185
219
  }
186
220
  }
187
221
  /**
188
- * Deploy a package to a workspace.
222
+ * Start deploying a package to a workspace, as a job the client polls.
223
+ *
224
+ * @remarks
225
+ * A deploy that migrates a record, or builds an index over one, takes as long
226
+ * as the record is large, which outlasts a request. So the deploy runs as a
227
+ * job, in the compute the store dispatches it to: a local server's own
228
+ * process, or a cloud's. The package is resolved first, so a deploy of one the
229
+ * repository does not hold is refused at once, as `package_not_found`, and the
230
+ * job deploys exactly the version resolved.
231
+ *
232
+ * The job never opens a path-initialised input's file: its path is on the
233
+ * machine that exported the package. Each such input is left unassigned, and
234
+ * `e3 workspace deploy <url>` completes it over the dataset transfer protocol
235
+ * once the job has finished.
236
+ *
237
+ * @param storage - Storage backend
238
+ * @param repoPath - Repository identifier
239
+ * @param repo - The repository's name, which the job is filed under
240
+ * @param workspace - Workspace name
241
+ * @param request - The package, and what the deploy does with a record it
242
+ * cannot keep as it is
243
+ * @param deployStore - Where the job is filed, and dispatched from
244
+ * @returns The response: the job's id, or the error
189
245
  */
190
- export async function deployWorkspace(storage, repoPath, workspace, packageRef) {
246
+ export async function startWorkspaceDeploy(storage, repoPath, repo, workspace, request, deployStore) {
191
247
  try {
192
- const { name: pkgName, version: maybeVersion } = parsePackageRef(packageRef);
193
- const pkgVersion = maybeVersion ?? await packageGetLatestVersion(storage, repoPath, pkgName);
194
- if (!pkgVersion) {
195
- return sendError(NullType, errorToVariant(new Error(`Package not found: ${pkgName}`)));
196
- }
197
- // A path-initialised input names a path on the machine that EXPORTED the
198
- // package, never this server's. The server must not open it — even a path
199
- // it can read — or a package could adopt any server-readable file of the
200
- // declared type into the caller's repository. Every `file` source is left
201
- // unassigned with a warning: `e3 workspace deploy <url> --from-source`
202
- // completes those inputs over the dataset transfer protocol immediately
203
- // afterwards, and the server's commit runs the same validation.
204
- await workspaceDeploy(storage, repoPath, workspace, pkgName, pkgVersion, {
205
- resolveFileSources: false,
206
- sourceWarning: (message) => console.warn(`[deploy ${workspace}] ${message}`),
248
+ const { name, version: maybeVersion } = parsePackageRef(request.packageRef);
249
+ const version = maybeVersion ?? await packageGetLatestVersion(storage, repoPath, name);
250
+ if (version === undefined)
251
+ throw new PackageNotFoundError(name);
252
+ await packageResolve(storage, repoPath, name, version);
253
+ const id = randomUUID();
254
+ await deployStore.create(id, {
255
+ repo,
256
+ workspace,
257
+ packageName: name,
258
+ packageVersion: version,
259
+ schema: request.schema,
260
+ allowDropRecords: request.allowDropRecords,
261
+ plan: request.plan,
262
+ status: variant('processing', variant('pending', null)),
263
+ createdAt: new Date(),
207
264
  });
208
- return sendSuccess(NullType, null);
265
+ await deployStore.execute(id, repo);
266
+ return sendSuccess(PackageJobResponseType, { id });
209
267
  }
210
268
  catch (err) {
211
- return sendError(NullType, errorToVariant(err));
269
+ return sendError(PackageJobResponseType, errorToVariant(err));
212
270
  }
213
271
  }
214
272
  /**
215
- * Export a workspace as a zip archive.
273
+ * A deploy job's status: still running, what the deploy did, or why it did
274
+ * not.
275
+ *
276
+ * @param deployStore - Where the job is filed
277
+ * @param repo - The repository's name
278
+ * @param workspace - Workspace name
279
+ * @param id - The job's id
280
+ * @returns The response: the status, or the error when this workspace started
281
+ * no such job
216
282
  */
217
- export async function exportWorkspace(storage, repoPath, workspace) {
283
+ export async function getWorkspaceDeployStatus(deployStore, repo, workspace, id) {
218
284
  try {
219
- // Export to temp file
220
- const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'e3-ws-export-'));
221
- const tempPath = path.join(tempDir, 'workspace.zip');
222
- try {
223
- await workspaceExport(storage, repoPath, workspace, tempPath);
224
- const archive = await fs.readFile(tempPath);
225
- return sendSuccess(BlobType, new Uint8Array(archive));
226
- }
227
- finally {
228
- await fs.rm(tempDir, { recursive: true, force: true });
285
+ const job = await deployStore.get(id);
286
+ if (job === null || job.repo !== repo || job.workspace !== workspace) {
287
+ return sendError(WorkspaceDeployStatusType, variant('internal', {
288
+ message: `workspace '${workspace}' has no deploy job '${id}'`,
289
+ }));
229
290
  }
291
+ return sendSuccess(WorkspaceDeployStatusType, job.status);
230
292
  }
231
293
  catch (err) {
232
- return sendError(BlobType, errorToVariant(err));
294
+ return sendError(WorkspaceDeployStatusType, errorToVariant(err));
233
295
  }
234
296
  }
235
297
  //# sourceMappingURL=workspaces.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"workspaces.js","sourceRoot":"","sources":["../../../src/handlers/workspaces.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workspaces.js","sourceRoot":"","sources":["../../../src/handlers/workspaces.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=workspaces.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaces.spec.d.ts","sourceRoot":"","sources":["../../../src/handlers/workspaces.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,214 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ /**
6
+ * Deploy route tests: a deploy runs as a job the client polls, on the runner
7
+ * the job's store was given — an embedder mounts these routes with a store and
8
+ * a runner of its own — and without one, a deploy that owes an index build
9
+ * fails before it writes anything. While it runs, the job and the workspace's
10
+ * lock say how far it has got.
11
+ */
12
+ import { describe, it, beforeEach } from 'node:test';
13
+ import assert from 'node:assert/strict';
14
+ import { Hono } from 'hono';
15
+ import { DictType, NullType, OptionType, StringType, StructType, encodeBeast2For, decodeBeast2For, toEastTypeValue, variant, none, some, } from '@elaraai/east';
16
+ import { InMemoryTransferBackend, MockTaskRunner, readRecordState, storeDatasetBytes, workspaceCreate, workspaceGetState, } from '@elaraai/e3-core';
17
+ import { InMemoryStorage } from '@elaraai/e3-core/test';
18
+ import { BEAST2_CONTENT_TYPE, PackageJobResponseType, PackageObjectType, RecordObjectType, RecordIndexObjectType, WorkspaceDeployRequestType, WorkspaceDeployStatusType, } from '@elaraai/e3-types';
19
+ import { createWorkspaceRoutes } from '../routes/workspaces.js';
20
+ import { LockStatusType, ResponseType } from '../types.js';
21
+ const REPO = 'test-repo';
22
+ const WS = 'main';
23
+ const PlansType = DictType(StringType, StringType);
24
+ const decodeStarted = decodeBeast2For(ResponseType(PackageJobResponseType));
25
+ const decodeStatus = decodeBeast2For(ResponseType(WorkspaceDeployStatusType));
26
+ const decodeLock = decodeBeast2For(ResponseType(OptionType(LockStatusType)));
27
+ /**
28
+ * Seed `planrecords@1.0.0` — an empty `plans` record declaring one index — and
29
+ * an empty workspace to deploy it to.
30
+ *
31
+ * @returns An empty stored index collection: what a build of that index writes
32
+ */
33
+ async function seedIndexedPackage(storage) {
34
+ await storage.repos.create(REPO);
35
+ const state = await storeDatasetBytes(storage, REPO, encodeBeast2For(PlansType)(new Map()));
36
+ const ir = await storage.objects.write(REPO, new Uint8Array([0])); // stand-in IR: the mock runner never reads it
37
+ const index = await storage.objects.write(REPO, encodeBeast2For(RecordIndexObjectType)({
38
+ keyIr: ir,
39
+ multi: false,
40
+ valueIr: none,
41
+ keyType: toEastTypeValue(StringType),
42
+ valueType: toEastTypeValue(NullType),
43
+ buildIr: ir,
44
+ runner: variant('east_node', { platforms: [] }),
45
+ }));
46
+ const record = await storage.objects.write(REPO, encodeBeast2For(RecordObjectType)({
47
+ path: 'records/plans', mutations: new Map(), indexes: new Map([['by_value', index]]), migrations: [],
48
+ }));
49
+ const structure = variant('struct', new Map([
50
+ ['records', variant('struct', new Map([
51
+ ['plans', variant('value', { type: toEastTypeValue(PlansType), writable: false })],
52
+ ]))],
53
+ ]));
54
+ const pkg = await storage.objects.write(REPO, encodeBeast2For(PackageObjectType)({
55
+ tasks: new Map(),
56
+ data: { structure, refs: new Map([['records/plans', variant('value', { hash: state, versions: new Map() })]]) },
57
+ functions: new Map(),
58
+ records: new Map([['plans', record]]),
59
+ sources: new Map(),
60
+ }));
61
+ await storage.refs.packageWrite(REPO, 'planrecords', '1.0.0', pkg);
62
+ await workspaceCreate(storage, REPO, WS);
63
+ return storeDatasetBytes(storage, REPO, encodeBeast2For(DictType(StructType({ ik: StringType, k: StringType }), NullType))(new Map()));
64
+ }
65
+ /** The workspace routes, whose deploy jobs run on `getRunner`'s runner. */
66
+ function routes(storage, getRunner) {
67
+ const app = new Hono();
68
+ app.route('/api/repos/:repo/workspaces', createWorkspaceRoutes(storage, () => REPO, new InMemoryTransferBackend({
69
+ storage,
70
+ getRepoPath: () => REPO,
71
+ ...(getRunner !== undefined && { getRunner }),
72
+ }), getRunner ?? (() => new MockTaskRunner())));
73
+ return app;
74
+ }
75
+ /** Start a deploy of `packageRef`: the job's id, or why the server started none. */
76
+ async function start(app, packageRef = 'planrecords@1.0.0') {
77
+ const response = await app.request(`/api/repos/r/workspaces/${WS}/deploy`, {
78
+ method: 'POST',
79
+ headers: { 'Content-Type': BEAST2_CONTENT_TYPE },
80
+ body: encodeBeast2For(WorkspaceDeployRequestType)({
81
+ packageRef, schema: variant('migrate', null), allowDropRecords: false, plan: false,
82
+ }),
83
+ });
84
+ return decodeStarted(new Uint8Array(await response.arrayBuffer()));
85
+ }
86
+ /** A deploy job's status. */
87
+ async function poll(app, id) {
88
+ const response = await app.request(`/api/repos/r/workspaces/${WS}/deploy/${id}`);
89
+ const answer = decodeStatus(new Uint8Array(await response.arrayBuffer()));
90
+ if (answer.type !== 'success')
91
+ assert.fail(`the poll was refused: ${answer.value.type}`);
92
+ return answer.value;
93
+ }
94
+ /** What holds the workspace, and how far it says it has got; null when nothing does. */
95
+ async function lockStatus(app) {
96
+ const response = await app.request(`/api/repos/r/workspaces/${WS}/lock`);
97
+ const answer = decodeLock(new Uint8Array(await response.arrayBuffer()));
98
+ if (answer.type !== 'success')
99
+ assert.fail(`the lock was refused: ${answer.value.type}`);
100
+ return answer.value.type === 'some' ? answer.value.value : null;
101
+ }
102
+ /** A deploy job's status once it has finished. */
103
+ async function finished(app, id) {
104
+ for (;;) {
105
+ const status = await poll(app, id);
106
+ if (status.type !== 'processing')
107
+ return status;
108
+ await new Promise((resolve) => setTimeout(resolve, 5));
109
+ }
110
+ }
111
+ describe('deploy route', () => {
112
+ let storage;
113
+ let emptyIndex;
114
+ beforeEach(async () => {
115
+ storage = new InMemoryStorage();
116
+ emptyIndex = await seedIndexedPackage(storage);
117
+ });
118
+ it("runs a deploy as a job, which builds a record's indexes on the runner its store was given", async () => {
119
+ const runner = new MockTaskRunner();
120
+ runner.setDefaultResult({ state: 'success', cached: false, outputHash: emptyIndex });
121
+ const app = routes(storage, () => runner);
122
+ const started = await start(app);
123
+ if (started.type !== 'success')
124
+ assert.fail(`the deploy was refused: ${started.value.type}`);
125
+ const status = await finished(app, started.value.id);
126
+ if (status.type !== 'completed')
127
+ assert.fail(`the deploy did not complete: ${status.type}`);
128
+ assert.deepEqual(status.value.records.map((plan) => [plan.record, plan.action.type]), [['records/plans', 'mint']]);
129
+ assert.deepEqual(status.value.indexes.map((plan) => [plan.record, plan.index, plan.action.type]), [['records/plans', 'by_value', 'build']]);
130
+ assert.ok(runner.getCalls().length > 0, 'the index was built on the runner the store was given');
131
+ const ref = await storage.datasets.read(REPO, WS, 'records/plans');
132
+ assert.ok(ref && ref.type === 'value');
133
+ assert.deepEqual([...(await readRecordState(storage, REPO, ref.value.hash)).indexes.keys()], ['by_value']);
134
+ });
135
+ it('answers before the deploy has finished, and the job reports it once it has', async () => {
136
+ // A build that holds until released: a deploy over a large record, which
137
+ // outlasts the request that starts it.
138
+ let release;
139
+ const released = new Promise((resolve) => { release = resolve; });
140
+ const runner = {
141
+ execute: async () => {
142
+ await released;
143
+ return { state: 'success', cached: false, executionId: 'held', outputHash: emptyIndex };
144
+ },
145
+ };
146
+ const app = routes(storage, () => runner);
147
+ const started = await start(app);
148
+ if (started.type !== 'success')
149
+ assert.fail(`the deploy was refused: ${started.value.type}`);
150
+ assert.equal((await poll(app, started.value.id)).type, 'processing');
151
+ assert.equal(await workspaceGetState(storage, REPO, WS), null, 'nothing is deployed while the job runs');
152
+ release();
153
+ assert.equal((await finished(app, started.value.id)).type, 'completed');
154
+ assert.equal((await workspaceGetState(storage, REPO, WS))?.packageName, 'planrecords');
155
+ });
156
+ it('says how far it has got while it runs, in the job and through the workspace lock', async () => {
157
+ // A build that holds until released, and says when it has started.
158
+ let release;
159
+ const released = new Promise((resolve) => { release = resolve; });
160
+ let begin;
161
+ const building = new Promise((resolve) => { begin = resolve; });
162
+ const runner = {
163
+ execute: async () => {
164
+ begin();
165
+ await released;
166
+ return { state: 'success', cached: false, executionId: 'held', outputHash: emptyIndex };
167
+ },
168
+ };
169
+ const app = routes(storage, () => runner);
170
+ const started = await start(app);
171
+ if (started.type !== 'success')
172
+ assert.fail(`the deploy was refused: ${started.value.type}`);
173
+ await building;
174
+ // The deploy is building the record's index: the job says so.
175
+ const status = await poll(app, started.value.id);
176
+ if (status.type !== 'processing' || status.value.type !== 'deploying' || status.value.value.type !== 'some') {
177
+ assert.fail(`the job says nothing of how far it has got: ${status.type}`);
178
+ }
179
+ const progress = status.value.value.value;
180
+ assert.deepEqual(progress.package, { name: 'planrecords', version: '1.0.0' });
181
+ assert.deepEqual(progress.files, [], 'a server leaves a file source to the client, so it takes in none');
182
+ assert.deepEqual(progress.records, [{
183
+ plan: { record: 'records/plans', action: variant('mint', null) },
184
+ indexes: ['by_value'],
185
+ step: variant('indexing', { index: 'by_value', build: 1n, builds: 1n }),
186
+ }]);
187
+ // So does its lock, for a watcher that knows no job: a first deploy has no
188
+ // status to read.
189
+ const lock = await lockStatus(app);
190
+ assert.equal(lock?.state.operation.type, 'deployment');
191
+ assert.deepEqual(lock?.progress, some(variant('deployment', progress)));
192
+ release();
193
+ assert.equal((await finished(app, started.value.id)).type, 'completed');
194
+ assert.equal(await lockStatus(app), null, 'nothing holds the workspace once the deploy has finished');
195
+ });
196
+ it('without a runner, fails a deploy that owes an index build, and writes nothing', async () => {
197
+ const app = routes(storage);
198
+ const started = await start(app);
199
+ if (started.type !== 'success')
200
+ assert.fail(`the deploy was refused: ${started.value.type}`);
201
+ const status = await finished(app, started.value.id);
202
+ if (status.type !== 'failed')
203
+ assert.fail(`the deploy did not fail: ${status.type}`);
204
+ assert.match(status.value.message, /given no task runner/);
205
+ assert.equal(await workspaceGetState(storage, REPO, WS), null, 'the workspace is still undeployed');
206
+ assert.deepEqual(await storage.datasets.list(REPO, WS), [], 'no ref was written');
207
+ });
208
+ it('refuses a package the repository does not hold at once, starting no job', async () => {
209
+ const started = await start(routes(storage), 'planrecords@9.9.9');
210
+ assert.equal(started.type, 'error');
211
+ assert.equal(started.value.type, 'package_not_found');
212
+ });
213
+ });
214
+ //# sourceMappingURL=workspaces.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaces.spec.js","sourceRoot":"","sources":["../../../src/handlers/workspaces.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EACL,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAC/H,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,uBAAuB,EAAE,cAAc,EAAE,eAAe,EAAE,iBAAiB,EAAE,eAAe,EAAE,iBAAiB,GAEhH,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EACL,mBAAmB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,qBAAqB,EACvG,0BAA0B,EAAE,yBAAyB,GACtD,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAmB,MAAM,aAAa,CAAC;AAE5E,MAAM,IAAI,GAAG,WAAW,CAAC;AACzB,MAAM,EAAE,GAAG,MAAM,CAAC;AAClB,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AACnD,MAAM,aAAa,GAAG,eAAe,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC,CAAC;AAC5E,MAAM,YAAY,GAAG,eAAe,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC,CAAC;AAC9E,MAAM,UAAU,GAAG,eAAe,CAAC,YAAY,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;AAE7E;;;;;GAKG;AACH,KAAK,UAAU,kBAAkB,CAAC,OAAwB;IACxD,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;IAC5F,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,8CAA8C;IACjH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe,CAAC,qBAAqB,CAAC,CAAC;QACrF,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,KAAK;QACZ,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,eAAe,CAAC,UAAU,CAAC;QACpC,SAAS,EAAE,eAAe,CAAC,QAAQ,CAAC;QACpC,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;KAChD,CAAC,CAAC,CAAC;IACJ,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe,CAAC,gBAAgB,CAAC,CAAC;QACjF,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE;KACrG,CAAC,CAAC,CAAC;IACJ,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC;QAC1C,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC;gBACpC,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,eAAe,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;aACnF,CAAC,CAAC,CAAC;KACL,CAAC,CAAC,CAAC;IACJ,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe,CAAC,iBAAiB,CAAC,CAAC;QAC/E,KAAK,EAAE,IAAI,GAAG,EAAE;QAChB,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,eAAe,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;QAC/G,SAAS,EAAE,IAAI,GAAG,EAAE;QACpB,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QACrC,OAAO,EAAE,IAAI,GAAG,EAAE;KACnB,CAAC,CAAC,CAAC;IACJ,MAAM,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IACnE,MAAM,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IACzC,OAAO,iBAAiB,CAAC,OAAO,EAAE,IAAI,EACpC,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;AACnG,CAAC;AAED,2EAA2E;AAC3E,SAAS,MAAM,CAAC,OAAwB,EAAE,SAA4B;IACpE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,GAAG,CAAC,KAAK,CAAC,6BAA6B,EAAE,qBAAqB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,uBAAuB,CAAC;QAC9G,OAAO;QACP,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI;QACvB,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,CAAC;KAC9C,CAAC,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;IAChD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,oFAAoF;AACpF,KAAK,UAAU,KAAK,CAAC,GAAS,EAAE,UAAU,GAAG,mBAAmB;IAC9D,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,2BAA2B,EAAE,SAAS,EAAE;QACzE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,mBAAmB,EAAE;QAChD,IAAI,EAAE,eAAe,CAAC,0BAA0B,CAAC,CAAC;YAChD,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK;SACnF,CAAC;KACH,CAAC,CAAC;IACH,OAAO,aAAa,CAAC,IAAI,UAAU,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,6BAA6B;AAC7B,KAAK,UAAU,IAAI,CAAC,GAAS,EAAE,EAAU;IACvC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,2BAA2B,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;IACjF,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,UAAU,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC1E,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;QAAE,MAAM,CAAC,IAAI,CAAC,yBAAyB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACzF,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB,CAAC;AAED,wFAAwF;AACxF,KAAK,UAAU,UAAU,CAAC,GAAS;IACjC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,2BAA2B,EAAE,OAAO,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,UAAU,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACxE,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;QAAE,MAAM,CAAC,IAAI,CAAC,yBAAyB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACzF,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAClE,CAAC;AAED,kDAAkD;AAClD,KAAK,UAAU,QAAQ,CAAC,GAAS,EAAE,EAAU;IAC3C,SAAS,CAAC;QACR,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY;YAAE,OAAO,MAAM,CAAC;QAChD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,IAAI,OAAwB,CAAC;IAC7B,IAAI,UAAkB,CAAC;IAEvB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,OAAO,GAAG,IAAI,eAAe,EAAE,CAAC;QAChC,UAAU,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2FAA2F,EAAE,KAAK,IAAI,EAAE;QACzG,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACpC,MAAM,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;QACrF,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC;QAE1C,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;YAAE,MAAM,CAAC,IAAI,CAAC,2BAA2B,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7F,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrD,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW;YAAE,MAAM,CAAC,IAAI,CAAC,gCAAgC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5F,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QACnH,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAC9F,CAAC,CAAC,eAAe,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QAE5C,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,uDAAuD,CAAC,CAAC;QACjG,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,eAAe,CAAC,CAAC;QACnE,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;QACvC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,MAAM,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAC7G,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;QAC1F,yEAAyE;QACzE,uCAAuC;QACvC,IAAI,OAAoB,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,MAAM,MAAM,GAAG;YACb,OAAO,EAAE,KAAK,IAAI,EAAE;gBAClB,MAAM,QAAQ,CAAC;gBACf,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;YAC1F,CAAC;SACuB,CAAC;QAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC;QAE1C,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;YAAE,MAAM,CAAC,IAAI,CAAC,2BAA2B,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7F,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACrE,MAAM,CAAC,KAAK,CAAC,MAAM,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,wCAAwC,CAAC,CAAC;QAEzG,OAAO,EAAE,CAAC;QACV,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACxE,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kFAAkF,EAAE,KAAK,IAAI,EAAE;QAChG,mEAAmE;QACnE,IAAI,OAAoB,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,IAAI,KAAkB,CAAC;QACvB,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,GAAG,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG;YACb,OAAO,EAAE,KAAK,IAAI,EAAE;gBAClB,KAAK,EAAE,CAAC;gBACR,MAAM,QAAQ,CAAC;gBACf,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;YAC1F,CAAC;SACuB,CAAC;QAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC;QAE1C,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;YAAE,MAAM,CAAC,IAAI,CAAC,2BAA2B,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7F,MAAM,QAAQ,CAAC;QAEf,8DAA8D;QAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjD,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC5G,MAAM,CAAC,IAAI,CAAC,+CAA+C,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;QAC1C,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9E,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,EAAE,kEAAkE,CAAC,CAAC;QACzG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;gBAClC,IAAI,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE;gBAChE,OAAO,EAAE,CAAC,UAAU,CAAC;gBACrB,IAAI,EAAE,OAAO,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;aACxE,CAAC,CAAC,CAAC;QAEJ,2EAA2E;QAC3E,kBAAkB;QAClB,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACvD,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;QAExE,OAAO,EAAE,CAAC;QACV,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACxE,MAAM,CAAC,KAAK,CAAC,MAAM,UAAU,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,0DAA0D,CAAC,CAAC;IACxG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC7F,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC5B,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;YAAE,MAAM,CAAC,IAAI,CAAC,2BAA2B,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7F,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrD,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,CAAC,IAAI,CAAC,4BAA4B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACrF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;QAC3D,MAAM,CAAC,KAAK,CAAC,MAAM,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,mCAAmC,CAAC,CAAC;QACpG,MAAM,CAAC,SAAS,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,oBAAoB,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;QACvF,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC;QAClE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -10,7 +10,10 @@
10
10
  */
11
11
  export { createServer, type ServerConfig, type Server } from './server.js';
12
12
  export { ApiTypes } from './types.js';
13
+ export { resolveBudget, type BudgetSettings } from '@elaraai/e3-core';
13
14
  export * from './handlers/index.js';
15
+ export * from './routes/index.js';
14
16
  export { createAuthMiddleware, type AuthConfig } from './middleware/auth.js';
17
+ export { createRepositoryGate, createSingleRepositoryGate } from './middleware/repository.js';
15
18
  export { sendSuccess, sendError, sendSuccessWithStatus, decodeBeast2, decodeBody } from './beast2.js';
16
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,cAAc,qBAAqB,CAAC;AAGpC,OAAO,EAAE,oBAAoB,EAAE,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAG7E,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,qBAAqB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAItC,OAAO,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGtE,cAAc,qBAAqB,CAAC;AAGpC,cAAc,mBAAmB,CAAC;AAGlC,OAAO,EAAE,oBAAoB,EAAE,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAG7E,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAG9F,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,qBAAqB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}