@elaraai/e3-rack 0.0.0-bootstrap.0 → 1.0.94
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.
- package/README.md +407 -2
- package/dist/src/client/client.spec.d.ts +6 -0
- package/dist/src/client/client.spec.d.ts.map +1 -0
- package/dist/src/client/client.spec.js +150 -0
- package/dist/src/client/client.spec.js.map +1 -0
- package/dist/src/client/connect.d.ts +52 -0
- package/dist/src/client/connect.d.ts.map +1 -0
- package/dist/src/client/connect.js +112 -0
- package/dist/src/client/connect.js.map +1 -0
- package/dist/src/client/hub-client.d.ts +57 -0
- package/dist/src/client/hub-client.d.ts.map +1 -0
- package/dist/src/client/hub-client.js +87 -0
- package/dist/src/client/hub-client.js.map +1 -0
- package/dist/src/client/local-http.d.ts +78 -0
- package/dist/src/client/local-http.d.ts.map +1 -0
- package/dist/src/client/local-http.js +149 -0
- package/dist/src/client/local-http.js.map +1 -0
- package/dist/src/client/session-attempts.d.ts +20 -0
- package/dist/src/client/session-attempts.d.ts.map +1 -0
- package/dist/src/client/session-attempts.js +88 -0
- package/dist/src/client/session-attempts.js.map +1 -0
- package/dist/src/client/session-data-server.d.ts +37 -0
- package/dist/src/client/session-data-server.d.ts.map +1 -0
- package/dist/src/client/session-data-server.js +280 -0
- package/dist/src/client/session-data-server.js.map +1 -0
- package/dist/src/client/session-data-server.spec.d.ts +6 -0
- package/dist/src/client/session-data-server.spec.d.ts.map +1 -0
- package/dist/src/client/session-data-server.spec.js +192 -0
- package/dist/src/client/session-data-server.spec.js.map +1 -0
- package/dist/src/client/session.d.ts +119 -0
- package/dist/src/client/session.d.ts.map +1 -0
- package/dist/src/client/session.js +290 -0
- package/dist/src/client/session.js.map +1 -0
- package/dist/src/hub/config.d.ts +74 -0
- package/dist/src/hub/config.d.ts.map +1 -0
- package/dist/src/hub/config.js +159 -0
- package/dist/src/hub/config.js.map +1 -0
- package/dist/src/hub/fair-lease-store.d.ts +36 -0
- package/dist/src/hub/fair-lease-store.d.ts.map +1 -0
- package/dist/src/hub/fair-lease-store.js +73 -0
- package/dist/src/hub/fair-lease-store.js.map +1 -0
- package/dist/src/hub/hub.d.ts +91 -0
- package/dist/src/hub/hub.d.ts.map +1 -0
- package/dist/src/hub/hub.js +641 -0
- package/dist/src/hub/hub.js.map +1 -0
- package/dist/src/hub/hub.spec.d.ts +6 -0
- package/dist/src/hub/hub.spec.d.ts.map +1 -0
- package/dist/src/hub/hub.spec.js +363 -0
- package/dist/src/hub/hub.spec.js.map +1 -0
- package/dist/src/hub/infrastructure.spec.d.ts +6 -0
- package/dist/src/hub/infrastructure.spec.d.ts.map +1 -0
- package/dist/src/hub/infrastructure.spec.js +211 -0
- package/dist/src/hub/infrastructure.spec.js.map +1 -0
- package/dist/src/hub/lock.d.ts +62 -0
- package/dist/src/hub/lock.d.ts.map +1 -0
- package/dist/src/hub/lock.js +165 -0
- package/dist/src/hub/lock.js.map +1 -0
- package/dist/src/hub/main.d.ts +16 -0
- package/dist/src/hub/main.d.ts.map +1 -0
- package/dist/src/hub/main.js +56 -0
- package/dist/src/hub/main.js.map +1 -0
- package/dist/src/hub/session-bridge.d.ts +116 -0
- package/dist/src/hub/session-bridge.d.ts.map +1 -0
- package/dist/src/hub/session-bridge.js +336 -0
- package/dist/src/hub/session-bridge.js.map +1 -0
- package/dist/src/identity/file-identity-store.d.ts +18 -0
- package/dist/src/identity/file-identity-store.d.ts.map +1 -0
- package/dist/src/identity/file-identity-store.js +34 -0
- package/dist/src/identity/file-identity-store.js.map +1 -0
- package/dist/src/identity/file-identity-store.spec.d.ts +6 -0
- package/dist/src/identity/file-identity-store.spec.d.ts.map +1 -0
- package/dist/src/identity/file-identity-store.spec.js +59 -0
- package/dist/src/identity/file-identity-store.spec.js.map +1 -0
- package/dist/src/identity/in-memory-identity-store.d.ts +48 -0
- package/dist/src/identity/in-memory-identity-store.d.ts.map +1 -0
- package/dist/src/identity/in-memory-identity-store.js +102 -0
- package/dist/src/identity/in-memory-identity-store.js.map +1 -0
- package/dist/src/identity/machine-identity.d.ts +134 -0
- package/dist/src/identity/machine-identity.d.ts.map +1 -0
- package/dist/src/identity/machine-identity.js +65 -0
- package/dist/src/identity/machine-identity.js.map +1 -0
- package/dist/src/index.d.ts +34 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +34 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lease/closure.d.ts +96 -0
- package/dist/src/lease/closure.d.ts.map +1 -0
- package/dist/src/lease/closure.js +192 -0
- package/dist/src/lease/closure.js.map +1 -0
- package/dist/src/lease/closure.spec.d.ts +6 -0
- package/dist/src/lease/closure.spec.d.ts.map +1 -0
- package/dist/src/lease/closure.spec.js +35 -0
- package/dist/src/lease/closure.spec.js.map +1 -0
- package/dist/src/lease/coordinator.d.ts +34 -0
- package/dist/src/lease/coordinator.d.ts.map +1 -0
- package/dist/src/lease/coordinator.js +42 -0
- package/dist/src/lease/coordinator.js.map +1 -0
- package/dist/src/lease/in-memory-lease-store.d.ts +58 -0
- package/dist/src/lease/in-memory-lease-store.d.ts.map +1 -0
- package/dist/src/lease/in-memory-lease-store.js +132 -0
- package/dist/src/lease/in-memory-lease-store.js.map +1 -0
- package/dist/src/lease/lease-store.d.ts +169 -0
- package/dist/src/lease/lease-store.d.ts.map +1 -0
- package/dist/src/lease/lease-store.js +94 -0
- package/dist/src/lease/lease-store.js.map +1 -0
- package/dist/src/lease/lease-store.spec.d.ts +6 -0
- package/dist/src/lease/lease-store.spec.d.ts.map +1 -0
- package/dist/src/lease/lease-store.spec.js +8 -0
- package/dist/src/lease/lease-store.spec.js.map +1 -0
- package/dist/src/lease/rack-dispatch.d.ts +105 -0
- package/dist/src/lease/rack-dispatch.d.ts.map +1 -0
- package/dist/src/lease/rack-dispatch.js +6 -0
- package/dist/src/lease/rack-dispatch.js.map +1 -0
- package/dist/src/mutation-queue.d.ts +13 -0
- package/dist/src/mutation-queue.d.ts.map +1 -0
- package/dist/src/mutation-queue.js +17 -0
- package/dist/src/mutation-queue.js.map +1 -0
- package/dist/src/paths.d.ts +56 -0
- package/dist/src/paths.d.ts.map +1 -0
- package/dist/src/paths.js +82 -0
- package/dist/src/paths.js.map +1 -0
- package/dist/src/protocol/control.d.ts +295 -0
- package/dist/src/protocol/control.d.ts.map +1 -0
- package/dist/src/protocol/control.js +74 -0
- package/dist/src/protocol/control.js.map +1 -0
- package/dist/src/protocol/index.d.ts +9 -0
- package/dist/src/protocol/index.d.ts.map +1 -0
- package/dist/src/protocol/index.js +9 -0
- package/dist/src/protocol/index.js.map +1 -0
- package/dist/src/protocol/rack-wire.d.ts +357 -0
- package/dist/src/protocol/rack-wire.d.ts.map +1 -0
- package/dist/src/protocol/rack-wire.js +262 -0
- package/dist/src/protocol/rack-wire.js.map +1 -0
- package/dist/src/protocol/rack-wire.spec.d.ts +6 -0
- package/dist/src/protocol/rack-wire.spec.d.ts.map +1 -0
- package/dist/src/protocol/rack-wire.spec.js +14 -0
- package/dist/src/protocol/rack-wire.spec.js.map +1 -0
- package/dist/src/protocol/registration.d.ts +70 -0
- package/dist/src/protocol/registration.d.ts.map +1 -0
- package/dist/src/protocol/registration.js +67 -0
- package/dist/src/protocol/registration.js.map +1 -0
- package/dist/src/protocol/session-data.d.ts +69 -0
- package/dist/src/protocol/session-data.d.ts.map +1 -0
- package/dist/src/protocol/session-data.js +26 -0
- package/dist/src/protocol/session-data.js.map +1 -0
- package/dist/src/protocol/task-envelope.d.ts +198 -0
- package/dist/src/protocol/task-envelope.d.ts.map +1 -0
- package/dist/src/protocol/task-envelope.js +93 -0
- package/dist/src/protocol/task-envelope.js.map +1 -0
- package/dist/src/protocol/wire-golden.d.ts +8 -0
- package/dist/src/protocol/wire-golden.d.ts.map +1 -0
- package/dist/src/protocol/wire-golden.js +34 -0
- package/dist/src/protocol/wire-golden.js.map +1 -0
- package/dist/src/protocol/wire-samples.d.ts +11 -0
- package/dist/src/protocol/wire-samples.d.ts.map +1 -0
- package/dist/src/protocol/wire-samples.js +52 -0
- package/dist/src/protocol/wire-samples.js.map +1 -0
- package/dist/src/registry/file-rack-registry.d.ts +68 -0
- package/dist/src/registry/file-rack-registry.d.ts.map +1 -0
- package/dist/src/registry/file-rack-registry.js +138 -0
- package/dist/src/registry/file-rack-registry.js.map +1 -0
- package/dist/src/registry/file-rack-registry.spec.d.ts +6 -0
- package/dist/src/registry/file-rack-registry.spec.d.ts.map +1 -0
- package/dist/src/registry/file-rack-registry.spec.js +50 -0
- package/dist/src/registry/file-rack-registry.spec.js.map +1 -0
- package/dist/src/registry/rack-registry.d.ts +64 -0
- package/dist/src/registry/rack-registry.d.ts.map +1 -0
- package/dist/src/registry/rack-registry.js +65 -0
- package/dist/src/registry/rack-registry.js.map +1 -0
- package/dist/src/registry/rack-registry.spec.d.ts +6 -0
- package/dist/src/registry/rack-registry.spec.d.ts.map +1 -0
- package/dist/src/registry/rack-registry.spec.js +8 -0
- package/dist/src/registry/rack-registry.spec.js.map +1 -0
- package/dist/src/routing/eligibility.d.ts +38 -0
- package/dist/src/routing/eligibility.d.ts.map +1 -0
- package/dist/src/routing/eligibility.js +78 -0
- package/dist/src/routing/eligibility.js.map +1 -0
- package/dist/src/routing/host-coupling.d.ts +26 -0
- package/dist/src/routing/host-coupling.d.ts.map +1 -0
- package/dist/src/routing/host-coupling.js +62 -0
- package/dist/src/routing/host-coupling.js.map +1 -0
- package/dist/src/routing/policy.d.ts +188 -0
- package/dist/src/routing/policy.d.ts.map +1 -0
- package/dist/src/routing/policy.js +212 -0
- package/dist/src/routing/policy.js.map +1 -0
- package/dist/src/routing/routing.spec.d.ts +6 -0
- package/dist/src/routing/routing.spec.d.ts.map +1 -0
- package/dist/src/routing/routing.spec.js +100 -0
- package/dist/src/routing/routing.spec.js.map +1 -0
- package/dist/src/routing/tiers.d.ts +22 -0
- package/dist/src/routing/tiers.d.ts.map +1 -0
- package/dist/src/routing/tiers.js +26 -0
- package/dist/src/routing/tiers.js.map +1 -0
- package/dist/src/runner/api-server.d.ts +45 -0
- package/dist/src/runner/api-server.d.ts.map +1 -0
- package/dist/src/runner/api-server.js +21 -0
- package/dist/src/runner/api-server.js.map +1 -0
- package/dist/src/runner/capacity.d.ts +13 -0
- package/dist/src/runner/capacity.d.ts.map +1 -0
- package/dist/src/runner/capacity.js +18 -0
- package/dist/src/runner/capacity.js.map +1 -0
- package/dist/src/runner/rack-body.d.ts +43 -0
- package/dist/src/runner/rack-body.d.ts.map +1 -0
- package/dist/src/runner/rack-body.js +208 -0
- package/dist/src/runner/rack-body.js.map +1 -0
- package/dist/src/runner/rack-runner.d.ts +62 -0
- package/dist/src/runner/rack-runner.d.ts.map +1 -0
- package/dist/src/runner/rack-runner.js +75 -0
- package/dist/src/runner/rack-runner.js.map +1 -0
- package/dist/src/runner/rack-runner.spec.d.ts +6 -0
- package/dist/src/runner/rack-runner.spec.d.ts.map +1 -0
- package/dist/src/runner/rack-runner.spec.js +302 -0
- package/dist/src/runner/rack-runner.spec.js.map +1 -0
- package/dist/src/runner/split.spec.d.ts +6 -0
- package/dist/src/runner/split.spec.d.ts.map +1 -0
- package/dist/src/runner/split.spec.js +188 -0
- package/dist/src/runner/split.spec.js.map +1 -0
- package/dist/src/runner-event.d.ts +261 -0
- package/dist/src/runner-event.d.ts.map +1 -0
- package/dist/src/runner-event.js +332 -0
- package/dist/src/runner-event.js.map +1 -0
- package/dist/src/server/beast2.d.ts +19 -0
- package/dist/src/server/beast2.d.ts.map +1 -0
- package/dist/src/server/beast2.js +18 -0
- package/dist/src/server/beast2.js.map +1 -0
- package/dist/src/server/body-limit.d.ts +16 -0
- package/dist/src/server/body-limit.d.ts.map +1 -0
- package/dist/src/server/body-limit.js +53 -0
- package/dist/src/server/body-limit.js.map +1 -0
- package/dist/src/server/body-limit.spec.d.ts +2 -0
- package/dist/src/server/body-limit.spec.d.ts.map +1 -0
- package/dist/src/server/body-limit.spec.js +32 -0
- package/dist/src/server/body-limit.spec.js.map +1 -0
- package/dist/src/server/bounded.d.ts +16 -0
- package/dist/src/server/bounded.d.ts.map +1 -0
- package/dist/src/server/bounded.js +39 -0
- package/dist/src/server/bounded.js.map +1 -0
- package/dist/src/server/dispatch.d.ts +137 -0
- package/dist/src/server/dispatch.d.ts.map +1 -0
- package/dist/src/server/dispatch.js +267 -0
- package/dist/src/server/dispatch.js.map +1 -0
- package/dist/src/server/env-publication.d.ts +45 -0
- package/dist/src/server/env-publication.d.ts.map +1 -0
- package/dist/src/server/env-publication.js +10 -0
- package/dist/src/server/env-publication.js.map +1 -0
- package/dist/src/server/index.d.ts +16 -0
- package/dist/src/server/index.d.ts.map +1 -0
- package/dist/src/server/index.js +17 -0
- package/dist/src/server/index.js.map +1 -0
- package/dist/src/server/protocol.spec.d.ts +6 -0
- package/dist/src/server/protocol.spec.d.ts.map +1 -0
- package/dist/src/server/protocol.spec.js +78 -0
- package/dist/src/server/protocol.spec.js.map +1 -0
- package/dist/src/server/rack-routes.d.ts +175 -0
- package/dist/src/server/rack-routes.d.ts.map +1 -0
- package/dist/src/server/rack-routes.js +755 -0
- package/dist/src/server/rack-routes.js.map +1 -0
- package/dist/src/server/rack-routes.spec.d.ts +6 -0
- package/dist/src/server/rack-routes.spec.d.ts.map +1 -0
- package/dist/src/server/rack-routes.spec.js +477 -0
- package/dist/src/server/rack-routes.spec.js.map +1 -0
- package/dist/src/server/storage-bridge.d.ts +140 -0
- package/dist/src/server/storage-bridge.d.ts.map +1 -0
- package/dist/src/server/storage-bridge.js +6 -0
- package/dist/src/server/storage-bridge.js.map +1 -0
- package/dist/src/state-file.d.ts +10 -0
- package/dist/src/state-file.d.ts.map +1 -0
- package/dist/src/state-file.js +38 -0
- package/dist/src/state-file.js.map +1 -0
- package/dist/src/testing/in-memory.d.ts +116 -0
- package/dist/src/testing/in-memory.d.ts.map +1 -0
- package/dist/src/testing/in-memory.js +193 -0
- package/dist/src/testing/in-memory.js.map +1 -0
- package/dist/src/testing/index.d.ts +14 -0
- package/dist/src/testing/index.d.ts.map +1 -0
- package/dist/src/testing/index.js +14 -0
- package/dist/src/testing/index.js.map +1 -0
- package/dist/src/testing/lease-store-contract.d.ts +14 -0
- package/dist/src/testing/lease-store-contract.d.ts.map +1 -0
- package/dist/src/testing/lease-store-contract.js +78 -0
- package/dist/src/testing/lease-store-contract.js.map +1 -0
- package/dist/src/testing/protocol-suite.d.ts +38 -0
- package/dist/src/testing/protocol-suite.d.ts.map +1 -0
- package/dist/src/testing/protocol-suite.js +207 -0
- package/dist/src/testing/protocol-suite.js.map +1 -0
- package/dist/src/testing/rack-registry-contract.d.ts +15 -0
- package/dist/src/testing/rack-registry-contract.d.ts.map +1 -0
- package/dist/src/testing/rack-registry-contract.js +106 -0
- package/dist/src/testing/rack-registry-contract.js.map +1 -0
- package/dist/src/testing/test-rack-agent.d.ts +121 -0
- package/dist/src/testing/test-rack-agent.d.ts.map +1 -0
- package/dist/src/testing/test-rack-agent.js +316 -0
- package/dist/src/testing/test-rack-agent.js.map +1 -0
- package/dist/src/tls/tls.d.ts +67 -0
- package/dist/src/tls/tls.d.ts.map +1 -0
- package/dist/src/tls/tls.js +200 -0
- package/dist/src/tls/tls.js.map +1 -0
- package/dist/src/tls/tls.spec.d.ts +6 -0
- package/dist/src/tls/tls.spec.d.ts.map +1 -0
- package/dist/src/tls/tls.spec.js +101 -0
- package/dist/src/tls/tls.spec.js.map +1 -0
- package/dist/src/version.d.ts +9 -0
- package/dist/src/version.d.ts.map +1 -0
- package/dist/src/version.js +10 -0
- package/dist/src/version.js.map +1 -0
- package/package.json +67 -7
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import { variant } from '@elaraai/east';
|
|
6
|
+
import { ExecutionAttempt, touchReachable } from '@elaraai/e3-core';
|
|
7
|
+
import { closureHashes } from '../lease/closure.js';
|
|
8
|
+
import { isLeaseEventV2, leaseInputs, leaseRecordsUnit } from '../protocol/task-envelope.js';
|
|
9
|
+
/**
|
|
10
|
+
* Writes rack attempt records with the session's own repository formats.
|
|
11
|
+
* The hub serializes the calls and names itself as the process owner, so
|
|
12
|
+
* another session can take over without an owner-death probe ending the work.
|
|
13
|
+
* @param storage - Session storage backend
|
|
14
|
+
* @param repo - Repository path known only to the session
|
|
15
|
+
* @param owner - Resolves the hub's process identity
|
|
16
|
+
* @returns The current repository's attempt adapter
|
|
17
|
+
* @example
|
|
18
|
+
* const attempts = sessionAttempts(storage, repo, () => hubOwner);
|
|
19
|
+
*/
|
|
20
|
+
export function sessionAttempts(storage, repo, owner) {
|
|
21
|
+
const attemptFor = (lease) => {
|
|
22
|
+
if (!isLeaseEventV2(lease.event) || lease.attempt === undefined)
|
|
23
|
+
throw new Error('Rack lease has no current attempt');
|
|
24
|
+
return new ExecutionAttempt(storage, repo, lease.taskHash, leaseInputs(lease.event), {
|
|
25
|
+
inHash: lease.inputsHash, executionId: lease.attempt.executionId, startTime: lease.attempt.startedAtMs,
|
|
26
|
+
}, leaseRecordsUnit(lease.event));
|
|
27
|
+
};
|
|
28
|
+
const statusOf = (lease) => storage.refs.executionGet(repo, lease.taskHash, lease.inputsHash, lease.attempt.executionId);
|
|
29
|
+
return {
|
|
30
|
+
async closure(lease) {
|
|
31
|
+
const hashes = await closureHashes(lease.event.closure, (hash) => storage.objects.read(repo, hash));
|
|
32
|
+
if (!(await storage.objects.touch(repo, hashes)).every(Boolean))
|
|
33
|
+
throw new Error('Rack lease closure is missing objects');
|
|
34
|
+
return hashes;
|
|
35
|
+
},
|
|
36
|
+
async running(lease) {
|
|
37
|
+
const attempt = attemptFor(lease);
|
|
38
|
+
const current = await statusOf(lease);
|
|
39
|
+
if (current !== null && current.type !== 'running')
|
|
40
|
+
return;
|
|
41
|
+
const hub = owner();
|
|
42
|
+
await attempt.recordOwner(hub, new Date(attempt.ids.startTime));
|
|
43
|
+
if (current === null)
|
|
44
|
+
await attempt.recordRunning(hub, new Date(attempt.ids.startTime));
|
|
45
|
+
},
|
|
46
|
+
async stopped(lease, how, cause) {
|
|
47
|
+
const attempt = attemptFor(lease);
|
|
48
|
+
const current = await statusOf(lease);
|
|
49
|
+
if (current !== null && current.type !== 'running')
|
|
50
|
+
return;
|
|
51
|
+
if (how === 'cancelled') {
|
|
52
|
+
await attempt.recordStopped('cancelled', cause);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
await storage.logs.append(repo, lease.taskHash, lease.inputsHash, attempt.ids.executionId, 'stderr', `e3: ${cause}\n`);
|
|
56
|
+
await storage.logs.flush(repo, lease.taskHash, lease.inputsHash, attempt.ids.executionId);
|
|
57
|
+
await storage.refs.executionWrite(repo, lease.taskHash, lease.inputsHash, attempt.ids.executionId, variant('interrupted', {
|
|
58
|
+
executionId: attempt.ids.executionId, inputHashes: attempt.inputHashes,
|
|
59
|
+
startedAt: new Date(attempt.ids.startTime), completedAt: new Date(), pid: 0n, unit: attempt.unit,
|
|
60
|
+
reason: { kind: variant('host', 'rack.lease_lost'), message: cause },
|
|
61
|
+
}));
|
|
62
|
+
},
|
|
63
|
+
async outcome(lease, result) {
|
|
64
|
+
const attempt = attemptFor(lease);
|
|
65
|
+
const current = await statusOf(lease);
|
|
66
|
+
if (current !== null && current.type !== 'running')
|
|
67
|
+
return;
|
|
68
|
+
await storage.logs.flush(repo, lease.taskHash, lease.inputsHash, attempt.ids.executionId);
|
|
69
|
+
if (result.cancelled)
|
|
70
|
+
await attempt.recordStopped('cancelled', result.error ?? 'Rack work was cancelled');
|
|
71
|
+
else if (result.state === 'error')
|
|
72
|
+
await attempt.recordError(result.error ?? 'Rack execution failed', result.exitCode);
|
|
73
|
+
else if (result.status === 'success') {
|
|
74
|
+
if (result.outputHash === undefined || !await touchReachable(storage, repo, [result.outputHash]))
|
|
75
|
+
throw new Error('Rack output is incomplete');
|
|
76
|
+
await attempt.recordSuccess(result.outputHash, result.peakBytes);
|
|
77
|
+
}
|
|
78
|
+
else
|
|
79
|
+
await attempt.recordFailed(result.exitCode ?? null, result.error ?? null, result.peakBytes);
|
|
80
|
+
},
|
|
81
|
+
verifyOutput: (_lease, hash) => touchReachable(storage, repo, [hash]),
|
|
82
|
+
logs: {
|
|
83
|
+
append: (_alias, task, inputs, id, stream, data) => storage.logs.append(repo, task, inputs, id, stream, data),
|
|
84
|
+
flush: (_alias, task, inputs, id) => storage.logs.flush(repo, task, inputs, id),
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=session-attempts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-attempts.js","sourceRoot":"","sources":["../../../src/client/session-attempts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import { type StorageBackend } from '@elaraai/e3-core';
|
|
6
|
+
/** Configures one repository session's private data listener. */
|
|
7
|
+
export interface SessionDataOptions {
|
|
8
|
+
/** Backend whose repository formats this e3 release understands. */
|
|
9
|
+
storage: StorageBackend;
|
|
10
|
+
/** Canonical repository path, never opened by the hub. */
|
|
11
|
+
repoPath: string;
|
|
12
|
+
/** Unguessable session credential, shared only with the local hub. */
|
|
13
|
+
dataToken: string;
|
|
14
|
+
/** Private rack home, also useful for isolated tests. */
|
|
15
|
+
home?: string;
|
|
16
|
+
/** Tees logs after they have reached storage. */
|
|
17
|
+
onLog?: (executionId: string, stream: 'stdout' | 'stderr', data: string) => void;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Serves repository objects, staged uploads, logs and execution records locally.
|
|
21
|
+
*
|
|
22
|
+
* Uploads stream to immutable files on the repository's device. Hash, length,
|
|
23
|
+
* declaration and receipt must all match before adoption. Temporary metadata
|
|
24
|
+
* lets another live session recover an acknowledged upload after owner death.
|
|
25
|
+
* The hub fences lease operations; it never receives repository file paths.
|
|
26
|
+
*
|
|
27
|
+
* @param options - Repository backend, credential and log tee
|
|
28
|
+
* @returns The private socket and idempotent shutdown
|
|
29
|
+
* @example
|
|
30
|
+
* const data = await startSessionDataServer({ storage, repoPath, dataToken });
|
|
31
|
+
* await data.close();
|
|
32
|
+
*/
|
|
33
|
+
export declare function startSessionDataServer(options: SessionDataOptions): Promise<{
|
|
34
|
+
socketPath: string;
|
|
35
|
+
close(): Promise<void>;
|
|
36
|
+
}>;
|
|
37
|
+
//# sourceMappingURL=session-data-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-data-server.d.ts","sourceRoot":"","sources":["../../../src/client/session-data-server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAsE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAkB3H,iEAAiE;AACjE,MAAM,WAAW,kBAAkB;IACjC,oEAAoE;IACpE,OAAO,EAAE,cAAc,CAAC;IACxB,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,SAAS,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAClF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CAoMjI"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Licensed under BSL 1.1. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
6
|
+
import { mkdir, open, readFile, unlink } from 'node:fs/promises';
|
|
7
|
+
import { dirname } from 'node:path';
|
|
8
|
+
import { Hono } from 'hono';
|
|
9
|
+
import { ArrayType, BooleanType, StringType, decodeBeast2For, encodeBeast2For, equalFor } from '@elaraai/east';
|
|
10
|
+
import { atomicWriteFile, isObjectHash, transferStagingPath, touchReachable } from '@elaraai/e3-core';
|
|
11
|
+
import { decodeBody, sendSuccess } from '../server/beast2.js';
|
|
12
|
+
import { ensureRackHome, rackHome, sessionSocketPath } from '../paths.js';
|
|
13
|
+
import { InMemoryLeaseCoordinator } from '../lease/coordinator.js';
|
|
14
|
+
import { isLeaseEventV2 } from '../protocol/task-envelope.js';
|
|
15
|
+
import { LeaseDataType, LeaseOutcomeType, LeaseRunningType, LeaseStoppedType, SessionLogsType, SessionUploadStateType, SessionUploadType, TouchObjectsType, VerifyOutputType } from '../protocol/session-data.js';
|
|
16
|
+
import { closeSocketServer, serveOnSocket } from './local-http.js';
|
|
17
|
+
import { sessionAttempts } from './session-attempts.js';
|
|
18
|
+
const CHUNK_BYTES = 8 * 1024 * 1024;
|
|
19
|
+
const sameUpload = equalFor(SessionUploadType);
|
|
20
|
+
const encodeUpload = encodeBeast2For(SessionUploadStateType);
|
|
21
|
+
const decodeUpload = decodeBeast2For(SessionUploadStateType);
|
|
22
|
+
const UUID = /^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/;
|
|
23
|
+
/**
|
|
24
|
+
* Serves repository objects, staged uploads, logs and execution records locally.
|
|
25
|
+
*
|
|
26
|
+
* Uploads stream to immutable files on the repository's device. Hash, length,
|
|
27
|
+
* declaration and receipt must all match before adoption. Temporary metadata
|
|
28
|
+
* lets another live session recover an acknowledged upload after owner death.
|
|
29
|
+
* The hub fences lease operations; it never receives repository file paths.
|
|
30
|
+
*
|
|
31
|
+
* @param options - Repository backend, credential and log tee
|
|
32
|
+
* @returns The private socket and idempotent shutdown
|
|
33
|
+
* @example
|
|
34
|
+
* const data = await startSessionDataServer({ storage, repoPath, dataToken });
|
|
35
|
+
* await data.close();
|
|
36
|
+
*/
|
|
37
|
+
export async function startSessionDataServer(options) {
|
|
38
|
+
const { storage, repoPath: repo } = options;
|
|
39
|
+
const home = ensureRackHome(options.home ?? rackHome());
|
|
40
|
+
const socketPath = sessionSocketPath(home);
|
|
41
|
+
const app = new Hono();
|
|
42
|
+
const serial = new InMemoryLeaseCoordinator();
|
|
43
|
+
const localUploads = new Set();
|
|
44
|
+
let hubOwner;
|
|
45
|
+
const attempts = sessionAttempts(storage, repo, () => {
|
|
46
|
+
if (hubOwner === undefined)
|
|
47
|
+
throw new Error('Hub process identity is missing');
|
|
48
|
+
return hubOwner;
|
|
49
|
+
});
|
|
50
|
+
app.use('*', async (c, next) => {
|
|
51
|
+
if (c.req.header('authorization') !== `Bearer ${options.dataToken}`)
|
|
52
|
+
return c.text('Session credential required', 401);
|
|
53
|
+
await next();
|
|
54
|
+
});
|
|
55
|
+
const hashOf = (value) => { if (!isObjectHash(value))
|
|
56
|
+
throw new Error('Invalid object hash'); return value; };
|
|
57
|
+
const paths = (id) => {
|
|
58
|
+
if (!UUID.test(id))
|
|
59
|
+
throw new Error('Invalid upload identity');
|
|
60
|
+
return { data: transferStagingPath(repo, `rack-${id}`), meta: transferStagingPath(repo, `rack-${id}-meta`) };
|
|
61
|
+
};
|
|
62
|
+
const remove = async (path) => unlink(path).catch((err) => { if (err.code !== 'ENOENT')
|
|
63
|
+
throw err; });
|
|
64
|
+
const leaseOf = (json) => {
|
|
65
|
+
const lease = JSON.parse(json);
|
|
66
|
+
if (!isLeaseEventV2(lease.event) || typeof lease.leaseId !== 'string' || !isObjectHash(lease.taskHash) || !isObjectHash(lease.inputsHash))
|
|
67
|
+
throw new Error('Invalid lease record');
|
|
68
|
+
return lease;
|
|
69
|
+
};
|
|
70
|
+
const declaration = (value) => {
|
|
71
|
+
hashOf(value.hash);
|
|
72
|
+
const size = Number(value.size);
|
|
73
|
+
if (!Number.isSafeInteger(size) || size < 0 || size > 5 * 1024 ** 3 || !UUID.test(value.receipt))
|
|
74
|
+
throw new Error('Invalid upload declaration');
|
|
75
|
+
return size;
|
|
76
|
+
};
|
|
77
|
+
app.on(['HEAD', 'GET'], '/v1/objects/:hash', async (c) => {
|
|
78
|
+
const hash = hashOf(c.req.param('hash'));
|
|
79
|
+
if (!(await storage.objects.touch(repo, [hash]))[0])
|
|
80
|
+
return c.body(null, 404);
|
|
81
|
+
const { size } = await storage.objects.stat(repo, hash);
|
|
82
|
+
const headers = { 'content-type': 'application/octet-stream', 'content-length': String(size) };
|
|
83
|
+
if (c.req.method === 'HEAD')
|
|
84
|
+
return new Response(null, { headers });
|
|
85
|
+
let offset = 0;
|
|
86
|
+
const body = new ReadableStream({ async pull(controller) {
|
|
87
|
+
try {
|
|
88
|
+
if (offset >= size) {
|
|
89
|
+
controller.close();
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const bytes = await storage.objects.readRange(repo, hash, offset, Math.min(CHUNK_BYTES, size - offset));
|
|
93
|
+
if (bytes.length === 0)
|
|
94
|
+
throw new Error('Object ended before its declared size');
|
|
95
|
+
offset += bytes.length;
|
|
96
|
+
controller.enqueue(bytes);
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
controller.error(err);
|
|
100
|
+
}
|
|
101
|
+
} });
|
|
102
|
+
return new Response(body, { headers });
|
|
103
|
+
});
|
|
104
|
+
app.post('/v1/objects', async (c) => {
|
|
105
|
+
const reader = c.req.raw.body?.getReader();
|
|
106
|
+
const chunks = [];
|
|
107
|
+
let length = 0;
|
|
108
|
+
if (reader !== undefined)
|
|
109
|
+
for (;;) {
|
|
110
|
+
const { done, value } = await reader.read();
|
|
111
|
+
if (done)
|
|
112
|
+
break;
|
|
113
|
+
length += value.length;
|
|
114
|
+
if (length > 4096) {
|
|
115
|
+
await reader.cancel();
|
|
116
|
+
return c.text('Inline object exceeds 4096 bytes', 413);
|
|
117
|
+
}
|
|
118
|
+
chunks.push(value);
|
|
119
|
+
}
|
|
120
|
+
return sendSuccess(StringType, await storage.objects.write(repo, Buffer.concat(chunks)));
|
|
121
|
+
});
|
|
122
|
+
app.post('/v1/touch', async (c) => sendSuccess(ArrayType(BooleanType), await storage.objects.touch(repo, await decodeBody(c, TouchObjectsType))));
|
|
123
|
+
app.post('/v1/verify', async (c) => {
|
|
124
|
+
const { hash } = await decodeBody(c, VerifyOutputType);
|
|
125
|
+
return sendSuccess(BooleanType, await touchReachable(storage, repo, [hashOf(hash)]));
|
|
126
|
+
});
|
|
127
|
+
app.put('/v1/uploads/:id', async (c) => {
|
|
128
|
+
const id = c.req.param('id');
|
|
129
|
+
const files = paths(id);
|
|
130
|
+
const declaredSize = c.req.query('size') ?? '';
|
|
131
|
+
if (!/^\d+$/.test(declaredSize) || !Number.isSafeInteger(Number(declaredSize)) || Number(declaredSize) > 5 * 1024 ** 3)
|
|
132
|
+
return c.text('Invalid upload size', 400);
|
|
133
|
+
const info = { leaseId: c.req.query('lease') ?? '', hash: c.req.query('hash') ?? '', size: BigInt(Number(declaredSize)), receipt: c.req.query('receipt') ?? '' };
|
|
134
|
+
const size = declaration(info);
|
|
135
|
+
return serial.run(repo, id, async () => {
|
|
136
|
+
try {
|
|
137
|
+
const prior = decodeUpload(await readFile(files.meta));
|
|
138
|
+
if (!sameUpload(prior.declaration, info))
|
|
139
|
+
return c.text('Upload declaration changed', 409);
|
|
140
|
+
// The prior PUT succeeded, even if its response was lost. Never open
|
|
141
|
+
// an adopted file for writing: it may share the object's inode.
|
|
142
|
+
return new Response(null, { headers: { 'x-amz-version-id': info.receipt } });
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
if (err.code !== 'ENOENT')
|
|
146
|
+
throw err;
|
|
147
|
+
}
|
|
148
|
+
// A predecessor session can still be unwinding an aborted PUT when a
|
|
149
|
+
// successor begins. Each PUT owns a distinct file, so its catch/close
|
|
150
|
+
// cannot unlink the successor's acknowledged upload.
|
|
151
|
+
const fileId = randomUUID();
|
|
152
|
+
const data = paths(fileId).data;
|
|
153
|
+
localUploads.add(data);
|
|
154
|
+
await mkdir(dirname(data), { recursive: true });
|
|
155
|
+
const file = await open(data, 'wx', 0o600);
|
|
156
|
+
let length = 0;
|
|
157
|
+
const hash = createHash('sha256');
|
|
158
|
+
try {
|
|
159
|
+
const reader = c.req.raw.body?.getReader();
|
|
160
|
+
if (reader !== undefined)
|
|
161
|
+
for (;;) {
|
|
162
|
+
const { done, value } = await reader.read();
|
|
163
|
+
if (done)
|
|
164
|
+
break;
|
|
165
|
+
length += value.length;
|
|
166
|
+
if (length > size) {
|
|
167
|
+
await reader.cancel();
|
|
168
|
+
throw new Error('Upload exceeds its declared size');
|
|
169
|
+
}
|
|
170
|
+
hash.update(value);
|
|
171
|
+
await file.writeFile(value);
|
|
172
|
+
}
|
|
173
|
+
await file.close();
|
|
174
|
+
if (length !== size || hash.digest('hex') !== info.hash)
|
|
175
|
+
throw new Error('Upload checksum or length mismatch');
|
|
176
|
+
await atomicWriteFile(files.meta, encodeUpload({ declaration: info, fileId, committed: false }));
|
|
177
|
+
localUploads.delete(data);
|
|
178
|
+
return new Response(null, { headers: { 'x-amz-version-id': info.receipt } });
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
await file.close().catch(() => { });
|
|
182
|
+
await remove(data);
|
|
183
|
+
localUploads.delete(data);
|
|
184
|
+
return c.text(err instanceof Error ? err.message : String(err), 400);
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
app.post('/v1/uploads/:id/commit', async (c) => {
|
|
189
|
+
const id = c.req.param('id');
|
|
190
|
+
const files = paths(id);
|
|
191
|
+
const info = await decodeBody(c, SessionUploadType);
|
|
192
|
+
declaration(info);
|
|
193
|
+
return serial.run(repo, id, async () => {
|
|
194
|
+
let state;
|
|
195
|
+
try {
|
|
196
|
+
state = decodeUpload(await readFile(files.meta));
|
|
197
|
+
}
|
|
198
|
+
catch (err) {
|
|
199
|
+
if (err.code === 'ENOENT')
|
|
200
|
+
return sendSuccess(BooleanType, false);
|
|
201
|
+
throw err;
|
|
202
|
+
}
|
|
203
|
+
if (!sameUpload(state.declaration, info))
|
|
204
|
+
return sendSuccess(BooleanType, false);
|
|
205
|
+
if (state.committed)
|
|
206
|
+
return sendSuccess(BooleanType, (await storage.objects.touch(repo, [info.hash]))[0]);
|
|
207
|
+
const data = paths(state.fileId).data;
|
|
208
|
+
const adopted = await storage.objects.adoptFile(repo, data, info.hash);
|
|
209
|
+
if (adopted.size !== Number(info.size))
|
|
210
|
+
throw new Error('Adopted upload has a different size');
|
|
211
|
+
await atomicWriteFile(files.meta, encodeUpload({ declaration: info, fileId: state.fileId, committed: true }));
|
|
212
|
+
await remove(data);
|
|
213
|
+
return sendSuccess(BooleanType, true);
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
app.delete('/v1/uploads/:id', async (c) => {
|
|
217
|
+
const id = c.req.param('id');
|
|
218
|
+
const files = paths(id);
|
|
219
|
+
return serial.run(repo, id, async () => {
|
|
220
|
+
try {
|
|
221
|
+
await remove(paths(decodeUpload(await readFile(files.meta)).fileId).data);
|
|
222
|
+
}
|
|
223
|
+
catch (err) {
|
|
224
|
+
if (err.code !== 'ENOENT')
|
|
225
|
+
throw err;
|
|
226
|
+
}
|
|
227
|
+
await remove(files.meta);
|
|
228
|
+
return sendSuccess(BooleanType, true);
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
app.post('/v1/logs', async (c) => {
|
|
232
|
+
const request = await decodeBody(c, SessionLogsType);
|
|
233
|
+
for (const chunk of request.chunks) {
|
|
234
|
+
await storage.logs.append(repo, request.taskHash, request.inputsHash, request.executionId, chunk.stream.type, chunk.data);
|
|
235
|
+
options.onLog?.(request.executionId, chunk.stream.type, chunk.data);
|
|
236
|
+
}
|
|
237
|
+
await storage.logs.flush(repo, request.taskHash, request.inputsHash, request.executionId);
|
|
238
|
+
return sendSuccess(BooleanType, true);
|
|
239
|
+
});
|
|
240
|
+
app.post('/v1/logs/tee', async (c) => {
|
|
241
|
+
const request = await decodeBody(c, SessionLogsType);
|
|
242
|
+
for (const chunk of request.chunks)
|
|
243
|
+
options.onLog?.(request.executionId, chunk.stream.type, chunk.data);
|
|
244
|
+
return sendSuccess(BooleanType, true);
|
|
245
|
+
});
|
|
246
|
+
app.post('/v1/attempts/closure', async (c) => sendSuccess(ArrayType(StringType), [...await attempts.closure(leaseOf((await decodeBody(c, LeaseDataType)).leaseJson))]));
|
|
247
|
+
app.post('/v1/attempts/running', async (c) => {
|
|
248
|
+
const request = await decodeBody(c, LeaseRunningType);
|
|
249
|
+
hubOwner = request.owner;
|
|
250
|
+
const lease = leaseOf(request.leaseJson);
|
|
251
|
+
await serial.run(repo, lease.leaseId, () => attempts.running(lease, request.owner.bootId));
|
|
252
|
+
return sendSuccess(BooleanType, true);
|
|
253
|
+
});
|
|
254
|
+
app.post('/v1/attempts/stopped', async (c) => {
|
|
255
|
+
const request = await decodeBody(c, LeaseStoppedType);
|
|
256
|
+
const lease = leaseOf(request.leaseJson);
|
|
257
|
+
await serial.run(repo, lease.leaseId, () => attempts.stopped(lease, request.cancelled ? 'cancelled' : 'interrupted', request.cause));
|
|
258
|
+
return sendSuccess(BooleanType, true);
|
|
259
|
+
});
|
|
260
|
+
app.post('/v1/attempts/outcome', async (c) => {
|
|
261
|
+
const request = await decodeBody(c, LeaseOutcomeType);
|
|
262
|
+
const lease = leaseOf(request.leaseJson);
|
|
263
|
+
const result = JSON.parse(request.resultJson);
|
|
264
|
+
await serial.run(repo, lease.leaseId, () => attempts.outcome(lease, result));
|
|
265
|
+
return sendSuccess(BooleanType, true);
|
|
266
|
+
});
|
|
267
|
+
const server = await serveOnSocket(app, socketPath);
|
|
268
|
+
let closing;
|
|
269
|
+
return { socketPath, close() {
|
|
270
|
+
return closing ??= (async () => {
|
|
271
|
+
await closeSocketServer(server, socketPath);
|
|
272
|
+
// A graceful close follows hub unregistration, which transfers shared
|
|
273
|
+
// leases first. Keep acknowledged metadata for the successor session;
|
|
274
|
+
// the hub's lease cleanup deletes it, or ordinary staging GC does.
|
|
275
|
+
for (const data of localUploads)
|
|
276
|
+
await remove(data);
|
|
277
|
+
})();
|
|
278
|
+
} };
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=session-data-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-data-server.js","sourceRoot":"","sources":["../../../src/client/session-data-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-data-server.spec.d.ts","sourceRoot":"","sources":["../../../src/client/session-data-server.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|