@elaraai/e3-api-server 1.0.81 → 1.0.83

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 (63) hide show
  1. package/README.md +75 -8
  2. package/dist/src/auth/keys.d.ts +3 -0
  3. package/dist/src/auth/keys.d.ts.map +1 -1
  4. package/dist/src/auth/keys.js.map +1 -1
  5. package/dist/src/errors.d.ts.map +1 -1
  6. package/dist/src/errors.js +6 -1
  7. package/dist/src/errors.js.map +1 -1
  8. package/dist/src/handlers/dataflow.d.ts +6 -3
  9. package/dist/src/handlers/dataflow.d.ts.map +1 -1
  10. package/dist/src/handlers/dataflow.js +8 -8
  11. package/dist/src/handlers/dataflow.js.map +1 -1
  12. package/dist/src/handlers/dataflow.spec.js +30 -0
  13. package/dist/src/handlers/dataflow.spec.js.map +1 -1
  14. package/dist/src/handlers/functions.d.ts +88 -8
  15. package/dist/src/handlers/functions.d.ts.map +1 -1
  16. package/dist/src/handlers/functions.js +204 -145
  17. package/dist/src/handlers/functions.js.map +1 -1
  18. package/dist/src/handlers/functions.spec.js +153 -29
  19. package/dist/src/handlers/functions.spec.js.map +1 -1
  20. package/dist/src/handlers/index.d.ts +1 -1
  21. package/dist/src/handlers/index.d.ts.map +1 -1
  22. package/dist/src/handlers/index.js +1 -1
  23. package/dist/src/handlers/index.js.map +1 -1
  24. package/dist/src/index.d.ts +3 -2
  25. package/dist/src/index.d.ts.map +1 -1
  26. package/dist/src/index.js +3 -0
  27. package/dist/src/index.js.map +1 -1
  28. package/dist/src/middleware/repository.d.ts +40 -1
  29. package/dist/src/middleware/repository.d.ts.map +1 -1
  30. package/dist/src/middleware/repository.js +42 -4
  31. package/dist/src/middleware/repository.js.map +1 -1
  32. package/dist/src/middleware/repository.spec.d.ts +6 -0
  33. package/dist/src/middleware/repository.spec.d.ts.map +1 -0
  34. package/dist/src/middleware/repository.spec.js +118 -0
  35. package/dist/src/middleware/repository.spec.js.map +1 -0
  36. package/dist/src/routes/functions.d.ts +94 -13
  37. package/dist/src/routes/functions.d.ts.map +1 -1
  38. package/dist/src/routes/functions.js +116 -30
  39. package/dist/src/routes/functions.js.map +1 -1
  40. package/dist/src/routes/index.d.ts +1 -1
  41. package/dist/src/routes/index.d.ts.map +1 -1
  42. package/dist/src/routes/index.js +1 -1
  43. package/dist/src/routes/index.js.map +1 -1
  44. package/dist/src/routes/package-transfer.d.ts +5 -0
  45. package/dist/src/routes/package-transfer.d.ts.map +1 -1
  46. package/dist/src/routes/package-transfer.js +19 -6
  47. package/dist/src/routes/package-transfer.js.map +1 -1
  48. package/dist/src/routes/transfer.d.ts +9 -6
  49. package/dist/src/routes/transfer.d.ts.map +1 -1
  50. package/dist/src/routes/transfer.js +23 -14
  51. package/dist/src/routes/transfer.js.map +1 -1
  52. package/dist/src/routes/transfer.spec.d.ts +6 -0
  53. package/dist/src/routes/transfer.spec.d.ts.map +1 -0
  54. package/dist/src/routes/transfer.spec.js +91 -0
  55. package/dist/src/routes/transfer.spec.js.map +1 -0
  56. package/dist/src/server.d.ts.map +1 -1
  57. package/dist/src/server.js +13 -6
  58. package/dist/src/server.js.map +1 -1
  59. package/dist/src/types.d.ts +132 -2
  60. package/dist/src/types.d.ts.map +1 -1
  61. package/dist/src/types.js +10 -2
  62. package/dist/src/types.js.map +1 -1
  63. package/package.json +7 -4
@@ -5,13 +5,13 @@
5
5
  import { describe, it, beforeEach } from 'node:test';
6
6
  import assert from 'node:assert/strict';
7
7
  import { Hono } from 'hono';
8
- import { IntegerType, encodeBeast2For, decodeBeast2For, toEastTypeValue, variant, some, none, } from '@elaraai/east';
9
- import { MockTaskRunner } from '@elaraai/e3-core';
8
+ import { East, IntegerType, NullType, StringType, encodeBeast2For, decodeBeast2For, encodeEastIR, toEastTypeValue, variant, some, none, } from '@elaraai/east';
9
+ import { InMemoryTransferBackend, MockTaskRunner } from '@elaraai/e3-core';
10
10
  import { InMemoryStorage } from '@elaraai/e3-core/test';
11
11
  import { BEAST2_CONTENT_TYPE, FunctionObjectType, PackageObjectType } from '@elaraai/e3-types';
12
- import { listPackageFunctions, describePackageFunction, callFunctionSync, } from './functions.js';
13
- import { createOneShotRoutes } from '../routes/functions.js';
14
- import { ResponseType, FunctionSignatureType, ExecuteResultType, OneShotRequestType, } from '../types.js';
12
+ import { listPackageFunctions, describePackageFunction, callFunctionSync, getSplitCallStatus, } from './functions.js';
13
+ import { createOneShotRoutes, createPackageFunctionRoutes, oneShotAccessByRoles } from '../routes/functions.js';
14
+ import { ResponseType, FunctionSignatureType, ExecuteResultType, FunctionCallRequestType, OneShotRequestType, PackageJobResponseType, SplitCallRequestType, SplitCallStatusType, } from '../types.js';
15
15
  import { ArrayType } from '@elaraai/east';
16
16
  const REPO = 'test-repo';
17
17
  const PKG = 'fn-pkg';
@@ -85,11 +85,51 @@ describe('function handlers', () => {
85
85
  const spec = runner.getDetachedCalls()[0];
86
86
  assert.deepEqual(spec.runner, variant('east_node', { platforms: ['@elaraai/east-node-std'] }));
87
87
  });
88
- it('a request runner override replaces the stored runner', async () => {
89
- await callFunctionSync(storage, REPO, runner, PKG, VERSION, 'double', callRequest([encodeInt(5n)], some(variant('east_py', { platforms: ['east-py-std'] }))));
88
+ it('a request runner override replaces the stored runner, under the elevated grant', async () => {
89
+ await callFunctionSync(storage, REPO, runner, PKG, VERSION, 'double', callRequest([encodeInt(5n)], some(variant('east_py', { platforms: ['east-py-std'] }))), false, undefined, 'any');
90
90
  const spec = runner.getDetachedCalls()[0];
91
91
  assert.deepEqual(spec.runner, variant('east_py', { platforms: ['east-py-std'] }));
92
92
  });
93
+ it('runs a call that names no runner for any caller, and one whose runner loads no package the function does not', async () => {
94
+ await callFunctionSync(storage, REPO, runner, PKG, VERSION, 'double', callRequest([encodeInt(5n)]), false, undefined, 'none');
95
+ assert.deepEqual(runner.getDetachedCalls()[0].runner, variant('east_node', { platforms: ['@elaraai/east-node-std'] }), 'the function\'s own runner');
96
+ await callFunctionSync(storage, REPO, runner, PKG, VERSION, 'double', callRequest([encodeInt(5n)], some(variant('east_c', { platforms: [] }))), false, undefined, 'platform_free');
97
+ assert.deepEqual(runner.getDetachedCalls()[1].runner, variant('east_c', { platforms: [] }), 'another stock runtime, given fewer packages');
98
+ });
99
+ it('refuses a caller without the elevated grant a runner that loads a package the function does not, and runs nothing', async () => {
100
+ for (const grant of ['platform_free', 'none']) {
101
+ const response = await callFunctionSync(storage, REPO, runner, PKG, VERSION, 'double', callRequest([encodeInt(5n)], some(variant('east_py', { platforms: ['east-py-std'] }))), false, undefined, grant);
102
+ const result = await decodeResponse(response, ExecuteResultType);
103
+ assert.equal(result.type, 'error', grant);
104
+ assert.deepEqual(result.value, variant('permission_denied', { path: 'runner' }), grant);
105
+ }
106
+ assert.equal(runner.getDetachedCalls().length, 0, 'nothing ran');
107
+ });
108
+ it('refuses a call that names the custom runtime, whatever the caller\'s grant, and runs nothing', async () => {
109
+ for (const grant of ['any', 'platform_free', 'none']) {
110
+ const response = await callFunctionSync(storage, REPO, runner, PKG, VERSION, 'double', callRequest([encodeInt(5n)], some(variant('custom', { command: ['sh', '-c', 'echo ran'] }))), false, undefined, grant);
111
+ const result = await decodeResponse(response, ExecuteResultType);
112
+ assert.equal(result.value.outcome.type, 'invalid', grant);
113
+ assert.match(result.value.outcome.value.diagnostics[0].message, /names the custom runtime/, grant);
114
+ }
115
+ assert.equal(runner.getDetachedCalls().length, 0, 'nothing ran');
116
+ });
117
+ it('holds a runner a call names to the grant its routes\' access gives, and to none without one', async () => {
118
+ const call = async (access) => {
119
+ const app = new Hono();
120
+ app.route('/api/repos/:repo/packages/:pkg/:version/functions', createPackageFunctionRoutes(storage, () => REPO, () => runner, access === undefined ? {} : { access }));
121
+ const response = await app.request(`/api/repos/r/packages/${PKG}/${VERSION}/functions/double`, {
122
+ method: 'POST',
123
+ headers: { 'Content-Type': BEAST2_CONTENT_TYPE },
124
+ body: encodeBeast2For(FunctionCallRequestType)(callRequest([encodeInt(5n)], some(variant('east_py', { platforms: ['east-py-std'] })))),
125
+ });
126
+ return decodeResponse(response, ExecuteResultType);
127
+ };
128
+ assert.deepEqual((await call(undefined)).value, variant('permission_denied', { path: 'runner' }), 'no access: no caller adds a package');
129
+ assert.deepEqual((await call(() => 'platform_free')).value, variant('permission_denied', { path: 'runner' }));
130
+ assert.equal((await call(() => 'any')).type, 'success', 'an elevated caller adds one');
131
+ assert.equal(runner.getDetachedCalls().length, 1);
132
+ });
93
133
  it('arity mismatch returns invalid without executing', async () => {
94
134
  const response = await callFunctionSync(storage, REPO, runner, PKG, VERSION, 'double', callRequest([encodeInt(1n), encodeInt(2n)]));
95
135
  const result = await decodeResponse(response, ExecuteResultType);
@@ -99,16 +139,24 @@ describe('function handlers', () => {
99
139
  assert.equal(runner.getDetachedCalls().length, 0, 'nothing should have executed');
100
140
  });
101
141
  });
102
- describe('one-shot role gate', () => {
103
- const oneShotBody = () => encodeBeast2For(OneShotRequestType)({
104
- bodyIr: new Uint8Array([0]),
142
+ describe('one-shot access', () => {
143
+ const twice = East.function([IntegerType], IntegerType, ($, x) => x.multiply(2n));
144
+ const log = East.platform('e3_test_log', [StringType], NullType);
145
+ const logging = East.function([IntegerType], IntegerType, ($, x) => {
146
+ $(log(East.value('called')));
147
+ return x;
148
+ });
149
+ /** A one-shot request: a platform-free body on a runtime given no package,
150
+ * unless the test says otherwise. */
151
+ const oneShotBody = (body = twice, runner = variant('east_node', { platforms: [] })) => encodeBeast2For(OneShotRequestType)({
152
+ bodyIr: encodeEastIR(body.toIR()),
105
153
  args: [],
106
- runner: variant('east_node', { platforms: [] }),
154
+ runner,
107
155
  limits: none,
108
156
  });
109
- const buildApp = (roles) => {
110
- const storage = new InMemoryStorage();
111
- const runner = new MockTaskRunner();
157
+ /** The one-shot routes behind `access`, with the identity a host's auth
158
+ * sets, when there is one. */
159
+ const buildApp = (access, runner, roles) => {
112
160
  const app = new Hono();
113
161
  if (roles !== undefined) {
114
162
  app.use('*', async (c, next) => {
@@ -116,31 +164,107 @@ describe('one-shot role gate', () => {
116
164
  await next();
117
165
  });
118
166
  }
119
- app.route('/api/repos/:repo/workspaces/:ws/one-shot', createOneShotRoutes(storage, () => REPO, () => runner));
167
+ app.route('/api/repos/:repo/workspaces/:ws/one-shot', createOneShotRoutes(new InMemoryStorage(), () => REPO, new InMemoryTransferBackend({}), () => runner, { access }));
120
168
  return app;
121
169
  };
122
- const post = (app) => app.request('/api/repos/r/workspaces/w/one-shot', {
170
+ const post = (app, body = oneShotBody()) => app.request('/api/repos/r/workspaces/w/one-shot', {
123
171
  method: 'POST',
124
172
  headers: { 'Content-Type': BEAST2_CONTENT_TYPE },
125
- body: oneShotBody(),
173
+ body,
126
174
  });
127
- it('refuses one-shot without an elevated role', async () => {
128
- const response = await post(buildApp(['member']));
129
- const result = await decodeResponse(response, ExecuteResultType);
130
- assert.equal(result.type, 'error');
131
- assert.equal(result.value.type, 'permission_denied');
175
+ it('gives an elevated role any one-shot, any other identity a platform-free one, and a request with none nothing', async () => {
176
+ const grantOf = async (roles, elevated) => {
177
+ const app = new Hono();
178
+ if (roles !== undefined) {
179
+ app.use('*', async (c, next) => {
180
+ c.set('identity', { sub: 'user', roles });
181
+ await next();
182
+ });
183
+ }
184
+ const access = elevated === undefined ? oneShotAccessByRoles() : oneShotAccessByRoles(elevated);
185
+ app.get('/', async (c) => c.text(await access(c)));
186
+ return (await app.request('/')).text();
187
+ };
188
+ assert.equal(await grantOf(['admin']), 'any');
189
+ assert.equal(await grantOf(['owner']), 'any');
190
+ assert.equal(await grantOf(['member']), 'platform_free');
191
+ assert.equal(await grantOf([]), 'platform_free');
192
+ assert.equal(await grantOf(undefined), 'none');
193
+ assert.equal(await grantOf(['owner'], ['admin']), 'platform_free', 'a host names the roles it elevates');
132
194
  });
133
- it('admits an admin past the gate (fails later on the missing workspace)', async () => {
134
- const response = await post(buildApp(['admin']));
135
- const result = await decodeResponse(response, ExecuteResultType);
136
- assert.equal(result.type, 'error');
137
- assert.notEqual(result.value.type, 'permission_denied');
195
+ it('answers permission_denied for a refused caller, and calls no runner', async () => {
196
+ const refused = [
197
+ ['none', oneShotBody()],
198
+ ['platform_free', oneShotBody(logging)],
199
+ ['platform_free', oneShotBody(twice, variant('east_node', { platforms: ['@elaraai/east-node-std'] }))],
200
+ ['platform_free', oneShotBody(twice, variant('custom', { command: ['sh'] }))],
201
+ ];
202
+ for (const [grant, body] of refused) {
203
+ const runner = new MockTaskRunner();
204
+ const result = await decodeResponse(await post(buildApp(() => grant, runner), body), ExecuteResultType);
205
+ assert.equal(result.type, 'error');
206
+ assert.deepEqual(result.value, variant('permission_denied', { path: 'one-shot' }));
207
+ assert.equal(runner.getDetachedCalls().length, 0, 'nothing ran');
208
+ }
138
209
  });
139
- it('admits unauthenticated callers when no auth is configured (single-tenant)', async () => {
140
- const response = await post(buildApp(undefined));
210
+ it('runs a one-shot that uses a platform on a server without auth, as a single-tenant server always has', async () => {
211
+ // Past the grant, the request fails on the workspace, which does not exist.
212
+ const runner = new MockTaskRunner();
213
+ const response = await post(buildApp(() => 'any', runner), oneShotBody(logging, variant('east_node', { platforms: ['@elaraai/east-node-std'] })));
141
214
  const result = await decodeResponse(response, ExecuteResultType);
142
215
  assert.equal(result.type, 'error');
143
216
  assert.notEqual(result.value.type, 'permission_denied');
144
217
  });
218
+ it('launches a split call only under a grant that runs it, and polls one only for a caller with a grant', async () => {
219
+ const split = (runner) => encodeBeast2For(SplitCallRequestType)({
220
+ bodyIr: encodeEastIR(twice.toIR()),
221
+ args: [{ arg: variant('value', encodeInt(1n)), partition: some({ by: [] }) }],
222
+ output: variant('array', null),
223
+ then: none,
224
+ runner,
225
+ limits: none,
226
+ });
227
+ const refused = [
228
+ ['none', split(variant('east_node', { platforms: [] }))],
229
+ ['platform_free', split(variant('east_node', { platforms: ['@elaraai/east-node-std'] }))],
230
+ ];
231
+ for (const [grant, body] of refused) {
232
+ const runner = new MockTaskRunner();
233
+ const response = await buildApp(() => grant, runner).request('/api/repos/r/workspaces/w/one-shot/split', {
234
+ method: 'POST',
235
+ headers: { 'Content-Type': BEAST2_CONTENT_TYPE },
236
+ body,
237
+ });
238
+ const result = await decodeResponse(response, PackageJobResponseType);
239
+ assert.equal(result.type, 'error');
240
+ assert.deepEqual(result.value, variant('permission_denied', { path: 'one-shot' }));
241
+ assert.equal(runner.getCalls().length, 0, 'nothing ran');
242
+ }
243
+ const polled = await buildApp(() => 'none', new MockTaskRunner()).request('/api/repos/r/workspaces/w/one-shot/split/job');
244
+ const status = await decodeResponse(polled, SplitCallStatusType);
245
+ assert.deepEqual(status.value, variant('permission_denied', { path: 'one-shot' }));
246
+ });
247
+ it('answers a split call only through the repository and workspace that launched it, and a reader only one a reader could launch', async () => {
248
+ const store = new InMemoryTransferBackend({}).splitCall;
249
+ const plan = { pieces: 3n, over: 0n, bytes: 100n };
250
+ // An explain's job, launched in workspace `w` of repository `r`: one a
251
+ // reader could launch, and one only an elevated grant could.
252
+ for (const [id, platformFree] of [['free', true], ['elevated', false]]) {
253
+ await store.create(id, {
254
+ repo: 'r', workspace: 'w', task: '', inputs: [], objects: [], then: none,
255
+ limits: { timeoutMs: 1000n, maxResultBytes: 1024n, maxLogBytes: 1024n },
256
+ read: [], explain: true, platformFree, status: variant('planned', plan), createdAt: new Date(),
257
+ });
258
+ }
259
+ const poll = async (repo, ws, id, grant) => decodeResponse(await getSplitCallStatus(new InMemoryStorage(), repo, store, repo, ws, id, grant), SplitCallStatusType);
260
+ for (const [repo, ws] of [['r', 'other'], ['other', 'w']]) {
261
+ const elsewhere = await poll(repo, ws, 'free', 'any');
262
+ assert.deepEqual(elsewhere, variant('error', variant('internal', { message: `workspace '${ws}' has no split call 'free'` })), `${repo}/${ws}`);
263
+ }
264
+ assert.deepEqual(await poll('r', 'w', 'free', 'any'), variant('success', variant('planned', plan)));
265
+ assert.deepEqual(await poll('r', 'w', 'free', 'platform_free'), variant('success', variant('planned', plan)));
266
+ assert.deepEqual(await poll('r', 'w', 'elevated', 'platform_free'), variant('error', variant('permission_denied', { path: 'one-shot' })));
267
+ assert.deepEqual(await poll('r', 'w', 'elevated', 'any'), variant('success', variant('planned', plan)));
268
+ });
145
269
  });
146
270
  //# sourceMappingURL=functions.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"functions.spec.js","sourceRoot":"","sources":["../../../src/handlers/functions.spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"functions.spec.js","sourceRoot":"","sources":["../../../src/handlers/functions.spec.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,6 @@ export { listWorkspaces, createWorkspace, getWorkspace, getWorkspaceStatus, dele
8
8
  export { listDatasets, listDatasetsRecursive, listDatasetsRecursivePaths, listDatasetsWithStatus, getDataset, getDatasetStatus, setDataset, } from './datasets.js';
9
9
  export { listTasks, getTask, } from './tasks.js';
10
10
  export { startDataflow, getDataflowStatus, getDataflowGraph, getTaskLogs, } from './dataflow.js';
11
- export { listPackageFunctions, describePackageFunction, callFunctionSync, callOneShotSync, } from './functions.js';
11
+ export { listPackageFunctions, describePackageFunction, callFunctionSync, startSplitCall, getSplitCallStatus, type StartSplitCallOptions, } from './functions.js';
12
12
  export { describeRecord, callMutationSync, compactRecord, getRecordHistory, } from './records.js';
13
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/handlers/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACT,SAAS,EACT,OAAO,EACP,WAAW,GACZ,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,YAAY,EACZ,UAAU,EACV,aAAa,GACd,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,cAAc,EACd,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,0BAA0B,EAC1B,sBAAsB,EACtB,UAAU,EACV,gBAAgB,EAChB,UAAU,GACX,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,SAAS,EACT,OAAO,GACR,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,GACZ,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,gBAAgB,EAChB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,gBAAgB,GACjB,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/handlers/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACT,SAAS,EACT,OAAO,EACP,WAAW,GACZ,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,YAAY,EACZ,UAAU,EACV,aAAa,GACd,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,cAAc,EACd,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,0BAA0B,EAC1B,sBAAsB,EACtB,UAAU,EACV,gBAAgB,EAChB,UAAU,GACX,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,SAAS,EACT,OAAO,GACR,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,GACZ,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,KAAK,qBAAqB,GAC3B,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,gBAAgB,GACjB,MAAM,cAAc,CAAC"}
@@ -8,6 +8,6 @@ export { listWorkspaces, createWorkspace, getWorkspace, getWorkspaceStatus, dele
8
8
  export { listDatasets, listDatasetsRecursive, listDatasetsRecursivePaths, listDatasetsWithStatus, getDataset, getDatasetStatus, setDataset, } from './datasets.js';
9
9
  export { listTasks, getTask, } from './tasks.js';
10
10
  export { startDataflow, getDataflowStatus, getDataflowGraph, getTaskLogs, } from './dataflow.js';
11
- export { listPackageFunctions, describePackageFunction, callFunctionSync, callOneShotSync, } from './functions.js';
11
+ export { listPackageFunctions, describePackageFunction, callFunctionSync, startSplitCall, getSplitCallStatus, } from './functions.js';
12
12
  export { describeRecord, callMutationSync, compactRecord, getRecordHistory, } from './records.js';
13
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/handlers/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACT,SAAS,EACT,OAAO,EACP,WAAW,GACZ,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,YAAY,EACZ,UAAU,EACV,aAAa,GACd,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,cAAc,EACd,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,0BAA0B,EAC1B,sBAAsB,EACtB,UAAU,EACV,gBAAgB,EAChB,UAAU,GACX,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,SAAS,EACT,OAAO,GACR,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,GACZ,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,gBAAgB,EAChB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,gBAAgB,GACjB,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/handlers/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACT,SAAS,EACT,OAAO,EACP,WAAW,GACZ,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,YAAY,EACZ,UAAU,EACV,aAAa,GACd,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,cAAc,EACd,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,0BAA0B,EAC1B,sBAAsB,EACtB,UAAU,EACV,gBAAgB,EAChB,UAAU,GACX,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,SAAS,EACT,OAAO,GACR,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,GACZ,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,GAEnB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,gBAAgB,GACjB,MAAM,cAAc,CAAC"}
@@ -13,7 +13,8 @@ export { ApiTypes } from './types.js';
13
13
  export { resolveBudget, type BudgetSettings } from '@elaraai/e3-core';
14
14
  export * from './handlers/index.js';
15
15
  export * from './routes/index.js';
16
- export { createAuthMiddleware, type AuthConfig } from './middleware/auth.js';
17
- export { createRepositoryGate, createSingleRepositoryGate } from './middleware/repository.js';
16
+ export { createAuthMiddleware, type AuthConfig, type Identity } from './middleware/auth.js';
17
+ export { generateKeyPair, signJwt, type KeyPair, type JwtPayload } from './auth/keys.js';
18
+ export { createRepositoryGate, createSingleRepositoryGate, type RepositoryGateOptions } from './middleware/repository.js';
18
19
  export { sendSuccess, sendError, sendSuccessWithStatus, decodeBeast2, decodeBody } from './beast2.js';
19
20
  //# 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;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"}
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,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAI5F,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGzF,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,KAAK,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAG1H,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,qBAAqB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
package/dist/src/index.js CHANGED
@@ -19,6 +19,9 @@ export * from './handlers/index.js';
19
19
  export * from './routes/index.js';
20
20
  // Export auth middleware
21
21
  export { createAuthMiddleware } from './middleware/auth.js';
22
+ // A key pair and the tokens it signs, as the built-in OIDC provider issues
23
+ // them: what a host or a test signs its callers' tokens with
24
+ export { generateKeyPair, signJwt } from './auth/keys.js';
22
25
  // The gate every request to one repository passes
23
26
  export { createRepositoryGate, createSingleRepositoryGate } from './middleware/repository.js';
24
27
  // Export BEAST2 helpers for custom integrations
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAkC,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,+EAA+E;AAC/E,4BAA4B;AAC5B,OAAO,EAAE,aAAa,EAAuB,MAAM,kBAAkB,CAAC;AAEtE,mCAAmC;AACnC,cAAc,qBAAqB,CAAC;AAEpC,uEAAuE;AACvE,cAAc,mBAAmB,CAAC;AAElC,yBAAyB;AACzB,OAAO,EAAE,oBAAoB,EAAmB,MAAM,sBAAsB,CAAC;AAE7E,kDAAkD;AAClD,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAE9F,gDAAgD;AAChD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,qBAAqB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAkC,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,+EAA+E;AAC/E,4BAA4B;AAC5B,OAAO,EAAE,aAAa,EAAuB,MAAM,kBAAkB,CAAC;AAEtE,mCAAmC;AACnC,cAAc,qBAAqB,CAAC;AAEpC,uEAAuE;AACvE,cAAc,mBAAmB,CAAC;AAElC,yBAAyB;AACzB,OAAO,EAAE,oBAAoB,EAAkC,MAAM,sBAAsB,CAAC;AAE5F,2EAA2E;AAC3E,6DAA6D;AAC7D,OAAO,EAAE,eAAe,EAAE,OAAO,EAAiC,MAAM,gBAAgB,CAAC;AAEzF,kDAAkD;AAClD,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAA8B,MAAM,4BAA4B,CAAC;AAE1H,gDAAgD;AAChD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,qBAAqB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
@@ -14,6 +14,34 @@
14
14
  */
15
15
  import type { MiddlewareHandler } from 'hono';
16
16
  import { type StorageBackend } from '@elaraai/e3-core';
17
+ /** How {@link createRepositoryGate} treats a repository that owes store
18
+ * upgrades. */
19
+ export interface RepositoryGateOptions {
20
+ /**
21
+ * Whether a request applies the upgrades a repository owes, at the first
22
+ * that finds the repository still: true unless set, as a local server does.
23
+ *
24
+ * @remarks
25
+ * A host whose requests have a time limit, which a step may outlast, passes
26
+ * `false` and applies them in a job of its own, by an open of the repository
27
+ * there (`repositoryOpen`) — the job {@link onUpgradePending} starts. Until
28
+ * the job has, the gate answers every request to the repository but a
29
+ * running dataflow's cancel and poll with 503 `repository_upgrade_pending`.
30
+ */
31
+ applyUpgrades?: boolean;
32
+ /**
33
+ * Called, with `applyUpgrades: false`, for each request to a repository that
34
+ * owes upgrades: the host starts the job that applies them here, or finds it
35
+ * started. It is called for every such request, so starting the job once is
36
+ * the host's to see to. It is awaited, and its failure is the host's to
37
+ * report: the request is answered all the same, and the next one calls it
38
+ * again.
39
+ *
40
+ * @param repo - The repository's name, as the request names it
41
+ * @param upgrades - The steps it owes, in the order they apply
42
+ */
43
+ onUpgradePending?: (repo: string, upgrades: readonly string[]) => void | Promise<void>;
44
+ }
17
45
  /**
18
46
  * The gate of a host's repositories: the repository exists, is not being
19
47
  * removed, and is opened as every way into a repository opens it — upgraded in
@@ -22,12 +50,23 @@ import { type StorageBackend } from '@elaraai/e3-core';
22
50
  * is not opened. It goes through the storage backend's `RepoStore`, so a host
23
51
  * mounts it over its own.
24
52
  *
53
+ * No request waits on an upgrade. The open refuses at once when the repository
54
+ * owes one and work running in it holds it, and the gate answers 503
55
+ * `repository_upgrade_pending`, naming the steps and the work, with a
56
+ * `Retry-After`; the steps apply at the first request that finds the
57
+ * repository still, or, with `options.applyUpgrades: false`, in the host's
58
+ * job, and the gate answers so until they have. A running dataflow's cancel
59
+ * and poll pass the gate all the same, so the run an upgrade waits for can
60
+ * always be stopped.
61
+ *
25
62
  * @param storage - Storage backend, whose `RepoStore` keeps the repositories
26
63
  * @param getRepoPath - A repository's identifier from its name, as the stores
27
64
  * other than the `RepoStore` take it
65
+ * @param options - Whether a request applies the upgrades a repository owes,
66
+ * and what starts the host's job when not
28
67
  * @returns The middleware
29
68
  */
30
- export declare function createRepositoryGate(storage: StorageBackend, getRepoPath: (repo: string) => string): MiddlewareHandler;
69
+ export declare function createRepositoryGate(storage: StorageBackend, getRepoPath: (repo: string) => string, options?: RepositoryGateOptions): MiddlewareHandler;
31
70
  /**
32
71
  * The gate of a server of one repository: the repository is `default`, and a
33
72
  * request to any other is not found. The server opens its repository as it
@@ -1 +1 @@
1
- {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/middleware/repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAW,iBAAiB,EAAE,MAAM,MAAM,CAAC;AACvD,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAQvE;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GACpC,iBAAiB,CAmCnB;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,IAAI,iBAAiB,CAU9D"}
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/middleware/repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAW,iBAAiB,EAAE,MAAM,MAAM,CAAC;AACvD,OAAO,EAAiD,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAsBtG;gBACgB;AAChB,MAAM,WAAW,qBAAqB;IACpC;;;;;;;;;;OAUG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;;;;;;OAUG;IACH,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxF;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EACrC,OAAO,GAAE,qBAA0B,GAClC,iBAAiB,CAgDnB;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,IAAI,iBAAiB,CAU9D"}
@@ -2,12 +2,24 @@
2
2
  * Copyright (c) 2025 Elara AI Pty Ltd
3
3
  * Licensed under BSL 1.1. See LICENSE for details.
4
4
  */
5
- import { repositoryOpen } from '@elaraai/e3-core';
5
+ import { RepositoryUpgradePendingError, repositoryOpen } from '@elaraai/e3-core';
6
6
  import { sendJsonError } from '../errors.js';
7
+ /** How long, in seconds, a client is told to wait before it asks again of a
8
+ * repository an upgrade waits on. */
9
+ const UPGRADE_RETRY_AFTER_S = 5;
7
10
  /** Whether a request creates or removes a repository. */
8
11
  function createsOrRemoves(c) {
9
12
  return (c.req.method === 'PUT' || c.req.method === 'DELETE') && /\/repos\/[^/]+$/.test(c.req.path);
10
13
  }
14
+ /**
15
+ * Whether a request stops or polls a workspace's dataflow: what a repository
16
+ * an upgrade waits on still answers, since the run is what the upgrade waits
17
+ * for, and both reach only the run's state and its orchestrator.
18
+ */
19
+ function stopsOrPollsDataflow(c) {
20
+ const run = /\/repos\/[^/]+\/workspaces\/[^/]+\/dataflow\/(cancel|execution)$/.exec(c.req.path);
21
+ return run !== null && (run[1] === 'cancel' ? c.req.method === 'POST' : c.req.method === 'GET');
22
+ }
11
23
  /**
12
24
  * The gate of a host's repositories: the repository exists, is not being
13
25
  * removed, and is opened as every way into a repository opens it — upgraded in
@@ -16,12 +28,24 @@ function createsOrRemoves(c) {
16
28
  * is not opened. It goes through the storage backend's `RepoStore`, so a host
17
29
  * mounts it over its own.
18
30
  *
31
+ * No request waits on an upgrade. The open refuses at once when the repository
32
+ * owes one and work running in it holds it, and the gate answers 503
33
+ * `repository_upgrade_pending`, naming the steps and the work, with a
34
+ * `Retry-After`; the steps apply at the first request that finds the
35
+ * repository still, or, with `options.applyUpgrades: false`, in the host's
36
+ * job, and the gate answers so until they have. A running dataflow's cancel
37
+ * and poll pass the gate all the same, so the run an upgrade waits for can
38
+ * always be stopped.
39
+ *
19
40
  * @param storage - Storage backend, whose `RepoStore` keeps the repositories
20
41
  * @param getRepoPath - A repository's identifier from its name, as the stores
21
42
  * other than the `RepoStore` take it
43
+ * @param options - Whether a request applies the upgrades a repository owes,
44
+ * and what starts the host's job when not
22
45
  * @returns The middleware
23
46
  */
24
- export function createRepositoryGate(storage, getRepoPath) {
47
+ export function createRepositoryGate(storage, getRepoPath, options = {}) {
48
+ const apply = options.applyUpgrades ?? true;
25
49
  return async (c, next) => {
26
50
  if (createsOrRemoves(c)) {
27
51
  await next();
@@ -47,10 +71,24 @@ export function createRepositoryGate(storage, getRepoPath) {
47
71
  }
48
72
  else {
49
73
  try {
50
- await repositoryOpen(storage, getRepoPath(repo));
74
+ await repositoryOpen(storage, getRepoPath(repo), { apply, waitMs: 0 });
51
75
  }
52
76
  catch (err) {
53
- return sendJsonError(err);
77
+ if (!(err instanceof RepositoryUpgradePendingError))
78
+ return sendJsonError(err);
79
+ if (err.job && options.onUpgradePending !== undefined) {
80
+ try {
81
+ await options.onUpgradePending(repo, err.upgrades);
82
+ }
83
+ catch {
84
+ // The host's to report; the next request calls it again.
85
+ }
86
+ }
87
+ if (!stopsOrPollsDataflow(c)) {
88
+ const refused = sendJsonError(err);
89
+ refused.headers.set('Retry-After', String(UPGRADE_RETRY_AFTER_S));
90
+ return refused;
91
+ }
54
92
  }
55
93
  }
56
94
  await next();
@@ -1 +1 @@
1
- {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/middleware/repository.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH,OAAO,EAAE,cAAc,EAAuB,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,yDAAyD;AACzD,SAAS,gBAAgB,CAAC,CAAU;IAClC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACrG,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAuB,EACvB,WAAqC;IAErC,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,IAAI,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAE,CAAC;QAElC,wEAAwE;QACxE,4BAA4B;QAC5B,IAAI,QAAQ,CAAC;QACb,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,IAAI,aAAa,EAAE,EAAE,GAAG,CAAC,CAAC;QACxF,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACxC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,IAAI,aAAa,EAAE,EAAE,GAAG,CAAC,CAAC;YACxF,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,MAAM,cAAc,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;YACnD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B;IACxC,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACjC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,IAAI,aAAa,EAAE,EAAE,GAAG,CAAC,CAAC;YACxF,CAAC;QACH,CAAC;QACD,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/middleware/repository.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=repository.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.spec.d.ts","sourceRoot":"","sources":["../../../src/middleware/repository.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}