@serve.zone/interfaces 32.35.0 → 32.36.1

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 (41) hide show
  1. package/changelog.md +63 -0
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts/data/backup.d.ts +7 -1
  4. package/dist_ts/data/deploymentlegacyimport.d.ts +92 -0
  5. package/dist_ts/data/deploymentlegacyimport.js +237 -0
  6. package/dist_ts/data/deploymentoperation.d.ts +63 -38
  7. package/dist_ts/data/deploymentoperation.js +12 -2
  8. package/dist_ts/data/deploymentpreflight.d.ts +42 -10
  9. package/dist_ts/data/deploymentpreflight.js +47 -10
  10. package/dist_ts/data/immutableimage.d.ts +26 -2
  11. package/dist_ts/data/immutableimage.js +12 -2
  12. package/dist_ts/data/index.d.ts +5 -0
  13. package/dist_ts/data/index.js +6 -1
  14. package/dist_ts/data/runtimeassignmentexec.d.ts +110 -0
  15. package/dist_ts/data/runtimeassignmentexec.js +164 -0
  16. package/dist_ts/data/runtimeassignmentlogs.d.ts +121 -0
  17. package/dist_ts/data/runtimeassignmentlogs.js +139 -0
  18. package/dist_ts/data/runtimeassignmentstats.d.ts +60 -0
  19. package/dist_ts/data/runtimeassignmentstats.js +93 -0
  20. package/dist_ts/data/runtimelocalvolumearchive.d.ts +103 -0
  21. package/dist_ts/data/runtimelocalvolumearchive.js +111 -0
  22. package/dist_ts/data/user.d.ts +6 -1
  23. package/dist_ts/data/user.js +6 -1
  24. package/dist_ts/requests/runtimesession.d.ts +81 -0
  25. package/dist_ts/requests/service.d.ts +51 -0
  26. package/package.json +1 -1
  27. package/readme.md +105 -0
  28. package/ts/00_commitinfo_data.ts +1 -1
  29. package/ts/data/backup.ts +7 -1
  30. package/ts/data/deploymentlegacyimport.ts +371 -0
  31. package/ts/data/deploymentoperation.ts +83 -39
  32. package/ts/data/deploymentpreflight.ts +86 -18
  33. package/ts/data/immutableimage.ts +42 -3
  34. package/ts/data/index.ts +5 -0
  35. package/ts/data/runtimeassignmentexec.ts +271 -0
  36. package/ts/data/runtimeassignmentlogs.ts +249 -0
  37. package/ts/data/runtimeassignmentstats.ts +149 -0
  38. package/ts/data/runtimelocalvolumearchive.ts +207 -0
  39. package/ts/data/user.ts +10 -0
  40. package/ts/requests/runtimesession.ts +102 -0
  41. package/ts/requests/service.ts +66 -0
@@ -0,0 +1,93 @@
1
+ import { getRuntimeAssignmentReference, snapshotRuntimeAssignment, validateRuntimeAssignment } from './runtimeassignment.js';
2
+ import { snapshotRuntimeSessionBinding } from './runtimesession.js';
3
+ import { captureNetwork, networkCounter, networkDigest, networkEqual, networkId, networkRecord, requireNetwork, } from '../private/networkcontract.js';
4
+ export const runtimeAssignmentStatsContract = Object.freeze({
5
+ error: 'Runtime assignment stats contract rejected.',
6
+ /** The node answers one read per assignment at a time and refuses a concurrent one. */
7
+ concurrency: 'one-read-per-assignment',
8
+ });
9
+ const fail = () => { throw new Error(runtimeAssignmentStatsContract.error); };
10
+ const safe = (operationArg) => { try {
11
+ return operationArg();
12
+ }
13
+ catch {
14
+ return fail();
15
+ } };
16
+ /** An unsigned 64-bit counter as canonical decimal digits: no sign, no leading zero. */
17
+ const decimalOf = (valueArg) => {
18
+ requireNetwork(typeof valueArg === 'string' && /^(0|[1-9][0-9]{0,19})$/.test(valueArg)
19
+ && BigInt(valueArg) <= 18446744073709551615n);
20
+ return valueArg;
21
+ };
22
+ const bytesOf = (valueArg) => {
23
+ requireNetwork(typeof valueArg === 'number' && Number.isSafeInteger(valueArg) && valueArg >= 0
24
+ && !Object.is(valueArg, -0));
25
+ return valueArg;
26
+ };
27
+ const referenceOf = (valueArg) => {
28
+ const value = networkRecord(valueArg, ['assignmentId', 'generation', 'digest']);
29
+ return {
30
+ assignmentId: networkId(value.assignmentId), generation: networkCounter(value.generation),
31
+ digest: networkDigest(value.digest),
32
+ };
33
+ };
34
+ const sampleOf = (valueArg) => {
35
+ const value = networkRecord(valueArg, ['timestampNs', 'cpuUsageCoreNanoseconds', 'memoryWorkingSetBytes',
36
+ 'memoryLimitBytes', 'network', 'writableLayerBytes']);
37
+ const timestampNs = decimalOf(value.timestampNs);
38
+ requireNetwork(timestampNs !== '0');
39
+ let network = null;
40
+ if (value.network !== null) {
41
+ const item = networkRecord(value.network, ['receivedBytes', 'transmittedBytes']);
42
+ network = { receivedBytes: bytesOf(item.receivedBytes), transmittedBytes: bytesOf(item.transmittedBytes) };
43
+ }
44
+ return {
45
+ timestampNs,
46
+ cpuUsageCoreNanoseconds: decimalOf(value.cpuUsageCoreNanoseconds),
47
+ memoryWorkingSetBytes: bytesOf(value.memoryWorkingSetBytes),
48
+ memoryLimitBytes: networkCounter(value.memoryLimitBytes),
49
+ network,
50
+ writableLayerBytes: value.writableLayerBytes === null ? null : bytesOf(value.writableLayerBytes),
51
+ };
52
+ };
53
+ export const snapshotReadRuntimeAssignmentStatsRequest = (valueArg) => safe(() => {
54
+ const value = networkRecord(captureNetwork(valueArg), ['session', 'assignment']);
55
+ return { session: snapshotRuntimeSessionBinding(value.session), assignment: referenceOf(value.assignment) };
56
+ });
57
+ export const snapshotReadRuntimeAssignmentStatsResponse = (valueArg) => safe(() => {
58
+ const value = networkRecord(captureNetwork(valueArg), ['status', 'assignment', 'sample']);
59
+ requireNetwork((value.status === 'sampled' && value.sample !== null)
60
+ || (value.status === 'not-running' && value.sample === null));
61
+ return {
62
+ status: value.status,
63
+ assignment: referenceOf(value.assignment),
64
+ sample: value.sample === null ? null : sampleOf(value.sample),
65
+ };
66
+ });
67
+ /**
68
+ * Node-side content binding, not authentication. `trustedSessionArg` is the node's CURRENT
69
+ * session, and the request must have arrived on that session's own connection. `assignmentArg` is
70
+ * the node's current admitted revision of the named assignment: the request must name exactly it,
71
+ * and it must belong to the session's controller, node and runtime namespace.
72
+ */
73
+ export const bindReadRuntimeAssignmentStatsRequest = async (valueArg, assignmentArg, trustedSessionArg) => {
74
+ const request = snapshotReadRuntimeAssignmentStatsRequest(valueArg);
75
+ const assignment = safe(() => snapshotRuntimeAssignment(assignmentArg));
76
+ const trustedSession = safe(() => snapshotRuntimeSessionBinding(trustedSessionArg));
77
+ if ((await validateRuntimeAssignment(assignment)).length)
78
+ fail();
79
+ safe(() => requireNetwork(networkEqual(request.session, trustedSession)
80
+ && networkEqual(assignment.controller, trustedSession.controller)
81
+ && assignment.nodeId === trustedSession.nodeId
82
+ && assignment.runtimeNamespace === trustedSession.runtimeNamespace
83
+ && networkEqual(request.assignment, getRuntimeAssignmentReference(assignment))));
84
+ return { request, assignment };
85
+ };
86
+ /** Matches a sample to the exact assignment revision the read named. */
87
+ export const bindReadRuntimeAssignmentStatsResponse = (valueArg, requestArg) => safe(() => {
88
+ const response = snapshotReadRuntimeAssignmentStatsResponse(valueArg);
89
+ const request = snapshotReadRuntimeAssignmentStatsRequest(requestArg);
90
+ requireNetwork(networkEqual(response.assignment, request.assignment));
91
+ return response;
92
+ });
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZWFzc2lnbm1lbnRzdGF0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2RhdGEvcnVudGltZWFzc2lnbm1lbnRzdGF0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUseUJBQXlCLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU3SCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRSxPQUFPLEVBQ0wsY0FBYyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsY0FBYyxHQUN0RyxNQUFNLCtCQUErQixDQUFDO0FBNkN2QyxNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzFELEtBQUssRUFBRSw2Q0FBNkM7SUFDcEQsdUZBQXVGO0lBQ3ZGLFdBQVcsRUFBRSx5QkFBeUI7Q0FDOUIsQ0FBQyxDQUFDO0FBRVosTUFBTSxJQUFJLEdBQUcsR0FBVSxFQUFFLEdBQUcsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyRixNQUFNLElBQUksR0FBRyxDQUFJLFlBQXFCLEVBQUssRUFBRSxHQUFHLElBQUksQ0FBQztJQUFDLE9BQU8sWUFBWSxFQUFFLENBQUM7QUFBQyxDQUFDO0FBQUMsTUFBTSxDQUFDO0lBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztBQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFMUcsd0ZBQXdGO0FBQ3hGLE1BQU0sU0FBUyxHQUFHLENBQUMsUUFBaUIsRUFBVSxFQUFFO0lBQzlDLGNBQWMsQ0FBQyxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksd0JBQXdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztXQUNqRixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUks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
@@ -0,0 +1,103 @@
1
+ import type * as plugins from '../plugins.js';
2
+ import type { TSha256Digest } from './immutableimage.js';
3
+ import type { IRuntimeAuthorityReference } from './runtimeassignment.js';
4
+ import type { IRuntimeLocalStorageClaim } from './runtimelocalstorageclaim.js';
5
+ import type { IRuntimeSessionBinding } from './runtimesession.js';
6
+ /**
7
+ * The one archive format a volume travels in: a POSIX.1-2001 pax archive of the volume's tree.
8
+ *
9
+ * The first entry is the volume's root, `./`, and every other name is relative below it. An entry is
10
+ * a directory, a regular file, a symbolic link (stored, never followed), a hard link to an earlier
11
+ * entry of the same archive, or a FIFO. Ownership is numeric: `uid` and `gid`, never user or group
12
+ * names, so the tree means the same on every host. Mode bits, including setuid, setgid and sticky,
13
+ * and the modification time travel exactly. A socket carries no bytes and belongs to the process
14
+ * that created it, so it is omitted; a device node, extended attributes and ACLs are not part of
15
+ * the format, and a volume that holds a device node is refused. The archive ends with the format's
16
+ * two zero blocks, so its length is a whole number of 512-byte blocks.
17
+ */
18
+ export type TRuntimeLocalVolumeArchiveFormat = 'pax';
19
+ /**
20
+ * A local controller reads one volume as an archive. The node refuses while a running container
21
+ * holds the volume: it reads a volume no container holds, or one whose holding container is
22
+ * stopped, which a node never restarts, and no container is granted the volume while it reads.
23
+ */
24
+ export interface IReadRuntimeLocalVolumeArchiveRequest {
25
+ session: IRuntimeSessionBinding;
26
+ /** The reference of the node's current generation of a bound `directory` claim. */
27
+ claim: IRuntimeAuthorityReference;
28
+ }
29
+ /**
30
+ * The archive arrives on the stream the TypedRequest answers beside this body. `holder` states
31
+ * whether the volume was read unheld or under a stopped holder. The stream carries no integrity:
32
+ * the node learns the archive's length and digest only while it writes it.
33
+ */
34
+ export interface IReadRuntimeLocalVolumeArchiveResponse {
35
+ claim: IRuntimeAuthorityReference;
36
+ format: TRuntimeLocalVolumeArchiveFormat;
37
+ holder: 'none' | 'stopped';
38
+ }
39
+ /**
40
+ * A local controller writes one archive as the bytes of an `import` claim that waits in
41
+ * `import-required`: the online form of an operator's offline import. The node receives the stream
42
+ * beside this body, whose integrity must be exactly `byteLength` and `digest`, unpacks it into a
43
+ * private staging tree, and publishes that tree as the volume only after the whole archive
44
+ * verified. The tree keeps the ownership the archive carries, as every imported tree does.
45
+ */
46
+ export interface IWriteRuntimeLocalVolumeArchiveRequest {
47
+ session: IRuntimeSessionBinding;
48
+ claim: IRuntimeAuthorityReference;
49
+ format: TRuntimeLocalVolumeArchiveFormat;
50
+ byteLength: number;
51
+ digest: TSha256Digest;
52
+ }
53
+ /**
54
+ * `receiving` permits sending and confirms nothing more. The stream's acceptance receipt is what
55
+ * confirms that the node published the volume as `ready`; a rejected or aborted stream leaves the
56
+ * claim in `import-required` with nothing published.
57
+ */
58
+ export interface IWriteRuntimeLocalVolumeArchiveResponse {
59
+ claim: IRuntimeAuthorityReference;
60
+ status: 'receiving';
61
+ }
62
+ /**
63
+ * Volume archives are a local controller's alone (`controller.kind: 'onebox'`), on the connection
64
+ * that holds its session, and a node moves one archive per volume at a time: a read or write of a
65
+ * volume that is already moving one is refused.
66
+ */
67
+ export declare const runtimeLocalVolumeArchiveContract: Readonly<{
68
+ readonly error: "Runtime local volume archive contract rejected.";
69
+ readonly controllerKind: "onebox";
70
+ readonly format: "pax";
71
+ readonly entryKinds: readonly ["directory", "file", "symlink", "hardlink", "fifo"];
72
+ readonly omittedEntryKinds: readonly ["socket"];
73
+ readonly ownership: "numeric-uid-gid";
74
+ readonly blockBytes: 512;
75
+ /** The shortest archive: the root directory's header and the two closing zero blocks. */
76
+ readonly minimumArchiveBytes: 1536;
77
+ readonly concurrency: "one-archive-per-volume";
78
+ }>;
79
+ export declare const snapshotReadRuntimeLocalVolumeArchiveRequest: (valueArg: unknown) => IReadRuntimeLocalVolumeArchiveRequest;
80
+ export declare const snapshotReadRuntimeLocalVolumeArchiveResponse: (valueArg: unknown) => IReadRuntimeLocalVolumeArchiveResponse;
81
+ export declare const snapshotWriteRuntimeLocalVolumeArchiveRequest: (valueArg: unknown) => IWriteRuntimeLocalVolumeArchiveRequest;
82
+ export declare const snapshotWriteRuntimeLocalVolumeArchiveResponse: (valueArg: unknown) => IWriteRuntimeLocalVolumeArchiveResponse;
83
+ /** The exact integrity the write's stream must carry: the request's length and digest. */
84
+ export declare const getRuntimeLocalVolumeArchiveIntegrity: (requestArg: unknown) => plugins.typedrequestInterfaces.IVirtualStreamIntegrity;
85
+ /**
86
+ * Node-side content binding, not authentication. `claimArg` is the node's current generation of the
87
+ * named claim and `trustedSessionArg` its CURRENT session, on whose own connection the request must
88
+ * have arrived. Whether the volume is `ready` and who holds it are the node's ledger checks.
89
+ */
90
+ export declare const bindReadRuntimeLocalVolumeArchiveRequest: (valueArg: unknown, claimArg: unknown, trustedSessionArg: unknown) => Promise<{
91
+ request: IReadRuntimeLocalVolumeArchiveRequest;
92
+ claim: IRuntimeLocalStorageClaim;
93
+ }>;
94
+ /**
95
+ * As the read binding, and the claim must be an `import` claim. That it still waits in
96
+ * `import-required` is the node's ledger check.
97
+ */
98
+ export declare const bindWriteRuntimeLocalVolumeArchiveRequest: (valueArg: unknown, claimArg: unknown, trustedSessionArg: unknown) => Promise<{
99
+ request: IWriteRuntimeLocalVolumeArchiveRequest;
100
+ claim: IRuntimeLocalStorageClaim;
101
+ }>;
102
+ export declare const bindReadRuntimeLocalVolumeArchiveResponse: (valueArg: unknown, requestArg: unknown) => IReadRuntimeLocalVolumeArchiveResponse;
103
+ export declare const bindWriteRuntimeLocalVolumeArchiveResponse: (valueArg: unknown, requestArg: unknown) => IWriteRuntimeLocalVolumeArchiveResponse;
@@ -0,0 +1,111 @@
1
+ import { getRuntimeLocalStorageClaimReference, snapshotRuntimeLocalStorageClaim, validateRuntimeLocalStorageClaim, } from './runtimelocalstorageclaim.js';
2
+ import { snapshotRuntimeSessionBinding } from './runtimesession.js';
3
+ import { captureNetwork, networkDigest, networkEqual, networkRecord, networkReference, requireNetwork, } from '../private/networkcontract.js';
4
+ /**
5
+ * Volume archives are a local controller's alone (`controller.kind: 'onebox'`), on the connection
6
+ * that holds its session, and a node moves one archive per volume at a time: a read or write of a
7
+ * volume that is already moving one is refused.
8
+ */
9
+ export const runtimeLocalVolumeArchiveContract = Object.freeze({
10
+ error: 'Runtime local volume archive contract rejected.',
11
+ controllerKind: 'onebox',
12
+ format: 'pax',
13
+ entryKinds: ['directory', 'file', 'symlink', 'hardlink', 'fifo'],
14
+ omittedEntryKinds: ['socket'],
15
+ ownership: 'numeric-uid-gid',
16
+ blockBytes: 512,
17
+ /** The shortest archive: the root directory's header and the two closing zero blocks. */
18
+ minimumArchiveBytes: 1536,
19
+ concurrency: 'one-archive-per-volume',
20
+ });
21
+ const fail = () => { throw new Error(runtimeLocalVolumeArchiveContract.error); };
22
+ const safe = (operationArg) => { try {
23
+ return operationArg();
24
+ }
25
+ catch {
26
+ return fail();
27
+ } };
28
+ const archiveBytesOf = (valueArg) => {
29
+ requireNetwork(typeof valueArg === 'number' && Number.isSafeInteger(valueArg)
30
+ && valueArg >= runtimeLocalVolumeArchiveContract.minimumArchiveBytes
31
+ && valueArg % runtimeLocalVolumeArchiveContract.blockBytes === 0);
32
+ return valueArg;
33
+ };
34
+ export const snapshotReadRuntimeLocalVolumeArchiveRequest = (valueArg) => safe(() => {
35
+ const value = networkRecord(captureNetwork(valueArg), ['session', 'claim']);
36
+ return { session: snapshotRuntimeSessionBinding(value.session), claim: networkReference(value.claim) };
37
+ });
38
+ export const snapshotReadRuntimeLocalVolumeArchiveResponse = (valueArg) => safe(() => {
39
+ const value = networkRecord(captureNetwork(valueArg), ['claim', 'format', 'holder']);
40
+ requireNetwork(value.format === 'pax' && (value.holder === 'none' || value.holder === 'stopped'));
41
+ return { claim: networkReference(value.claim), format: 'pax', holder: value.holder };
42
+ });
43
+ export const snapshotWriteRuntimeLocalVolumeArchiveRequest = (valueArg) => safe(() => {
44
+ const value = networkRecord(captureNetwork(valueArg), ['session', 'claim', 'format', 'byteLength', 'digest']);
45
+ requireNetwork(value.format === 'pax');
46
+ return {
47
+ session: snapshotRuntimeSessionBinding(value.session), claim: networkReference(value.claim), format: 'pax',
48
+ byteLength: archiveBytesOf(value.byteLength), digest: networkDigest(value.digest),
49
+ };
50
+ });
51
+ export const snapshotWriteRuntimeLocalVolumeArchiveResponse = (valueArg) => safe(() => {
52
+ const value = networkRecord(captureNetwork(valueArg), ['claim', 'status']);
53
+ requireNetwork(value.status === 'receiving');
54
+ return { claim: networkReference(value.claim), status: 'receiving' };
55
+ });
56
+ /** The exact integrity the write's stream must carry: the request's length and digest. */
57
+ export const getRuntimeLocalVolumeArchiveIntegrity = (requestArg) => {
58
+ const request = snapshotWriteRuntimeLocalVolumeArchiveRequest(requestArg);
59
+ return { algorithm: 'sha256', byteLength: request.byteLength, digest: request.digest };
60
+ };
61
+ /**
62
+ * The claim a request names must be the node's current generation of a bound `directory` claim of
63
+ * the session's controller, cluster, node and runtime namespace, and the session must be a local
64
+ * controller's current one.
65
+ */
66
+ const bindClaim = async (requestArg, claimArg, trustedSessionArg) => {
67
+ const trustedSession = safe(() => snapshotRuntimeSessionBinding(trustedSessionArg));
68
+ const claim = safe(() => snapshotRuntimeLocalStorageClaim(claimArg));
69
+ if ((await validateRuntimeLocalStorageClaim(claim)).length)
70
+ fail();
71
+ safe(() => requireNetwork(networkEqual(requestArg.session, trustedSession)
72
+ && trustedSession.controller.kind === runtimeLocalVolumeArchiveContract.controllerKind
73
+ && networkEqual(requestArg.claim, getRuntimeLocalStorageClaimReference(claim))
74
+ && claim.lifecycle === 'bound' && claim.source.kind === 'directory'
75
+ && networkEqual(claim.controller, trustedSession.controller)
76
+ && claim.clusterId === trustedSession.clusterId
77
+ && claim.nodeId === trustedSession.nodeId
78
+ && claim.runtimeNamespace === trustedSession.runtimeNamespace));
79
+ return claim;
80
+ };
81
+ /**
82
+ * Node-side content binding, not authentication. `claimArg` is the node's current generation of the
83
+ * named claim and `trustedSessionArg` its CURRENT session, on whose own connection the request must
84
+ * have arrived. Whether the volume is `ready` and who holds it are the node's ledger checks.
85
+ */
86
+ export const bindReadRuntimeLocalVolumeArchiveRequest = async (valueArg, claimArg, trustedSessionArg) => {
87
+ const request = snapshotReadRuntimeLocalVolumeArchiveRequest(valueArg);
88
+ return { request, claim: await bindClaim(request, claimArg, trustedSessionArg) };
89
+ };
90
+ /**
91
+ * As the read binding, and the claim must be an `import` claim. That it still waits in
92
+ * `import-required` is the node's ledger check.
93
+ */
94
+ export const bindWriteRuntimeLocalVolumeArchiveRequest = async (valueArg, claimArg, trustedSessionArg) => {
95
+ const request = snapshotWriteRuntimeLocalVolumeArchiveRequest(valueArg);
96
+ const claim = await bindClaim(request, claimArg, trustedSessionArg);
97
+ if (claim.initialization !== 'import')
98
+ fail();
99
+ return { request, claim };
100
+ };
101
+ export const bindReadRuntimeLocalVolumeArchiveResponse = (valueArg, requestArg) => safe(() => {
102
+ const response = snapshotReadRuntimeLocalVolumeArchiveResponse(valueArg);
103
+ requireNetwork(networkEqual(response.claim, snapshotReadRuntimeLocalVolumeArchiveRequest(requestArg).claim));
104
+ return response;
105
+ });
106
+ export const bindWriteRuntimeLocalVolumeArchiveResponse = (valueArg, requestArg) => safe(() => {
107
+ const response = snapshotWriteRuntimeLocalVolumeArchiveResponse(valueArg);
108
+ requireNetwork(networkEqual(response.claim, snapshotWriteRuntimeLocalVolumeArchiveRequest(requestArg).claim));
109
+ return response;
110
+ });
111
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZWxvY2Fsdm9sdW1lYXJjaGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2RhdGEvcnVudGltZWxvY2Fsdm9sdW1lYXJjaGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBQ0wsb0NBQW9DLEVBQUUsZ0NBQWdDLEVBQUUsZ0NBQWdDLEdBQ3pHLE1BQU0sK0JBQStCLENBQUM7QUFFdkMsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEUsT0FBTyxFQUNMLGNBQWMsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEdBQzdGLE1BQU0sK0JBQStCLENBQUM7QUErRHZDOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzdELEtBQUssRUFBRSxpREFBaUQ7SUFDeEQsY0FBYyxFQUFFLFFBQVE7SUFDeEIsTUFBTSxFQUFFLEtBQUs7SUFDYixVQUFVLEVBQUUsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDO0lBQ2hFLGlCQUFpQixFQUFFLENBQUMsUUFBUSxDQUFDO0lBQzdCLFNBQVMsRUFBRSxpQkFBaUI7SUFDNUIsVUFBVSxFQUFFLEdBQUc7SUFDZix5RkFBeUY7SUFDekYsbUJBQW1CLEVBQUUsSUFBSTtJQUN6QixXQUFXLEVBQUUsd0JBQXdCO0NBQzdCLENBQUMsQ0FBQztBQUVaLE1BQU0sSUFBSSxHQUFHLEdBQVUsRUFBRSxHQUFHLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEYsTUFBTSxJQUFJLEdBQUcsQ0FBSSxZQUFxQixFQUFLLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFBQyxPQUFPLFlBQVksRUFBRSxDQUFDO0FBQUMsQ0FBQztB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
@@ -3,7 +3,12 @@ export interface IToken {
3
3
  expiresAt: number;
4
4
  assignedRoles: string[];
5
5
  }
6
- export type TServiceDeploymentCapability = 'deployment:preflight' | 'deployment:reserve' | 'deployment:registry-push' | 'deployment:release-read' | 'deployment:promote-image' | 'deployment:adopt-existing' | 'deployment:status' | 'deployment:create-greenfield' | 'deployment:promote-route' | 'deployment:rollback-image' | 'deployment:rollback-route' | 'deployment:retry' | 'deployment:cleanup';
6
+ export type TServiceDeploymentCapability = 'deployment:preflight' | 'deployment:reserve' | 'deployment:registry-push' | 'deployment:release-read' | 'deployment:promote-image' | 'deployment:adopt-existing' | 'deployment:status' | 'deployment:create-greenfield'
7
+ /**
8
+ * Reserve a greenfield successor whose image Cloudly imports from an attested legacy service,
9
+ * and have Cloudly import it. Granted on an organization-service-slot grant only.
10
+ */
11
+ | 'deployment:import-legacy' | 'deployment:promote-route' | 'deployment:rollback-image' | 'deployment:rollback-route' | 'deployment:retry' | 'deployment:cleanup';
7
12
  /**
8
13
  * Server-persisted authority for one logical service. These grants are never
9
14
  * accepted from the identity payload supplied by a caller; Cloudly reloads
@@ -7,6 +7,7 @@ const serviceDeploymentCapabilities = new Set([
7
7
  'deployment:adopt-existing',
8
8
  'deployment:status',
9
9
  'deployment:create-greenfield',
10
+ 'deployment:import-legacy',
10
11
  'deployment:promote-route',
11
12
  'deployment:rollback-image',
12
13
  'deployment:rollback-route',
@@ -54,6 +55,10 @@ export const validateServiceDeploymentGrant = (grantArg) => {
54
55
  && capabilities.includes('deployment:adopt-existing')) {
55
56
  errors.push('deployment:adopt-existing requires an existing-service grant');
56
57
  }
58
+ if (capabilities && grant.scope !== 'organization-service-slot'
59
+ && capabilities.includes('deployment:import-legacy')) {
60
+ errors.push('deployment:import-legacy requires an organization-service-slot grant');
61
+ }
57
62
  return errors;
58
63
  };
59
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2RhdGEvdXNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUE4Q0EsTUFBTSw2QkFBNkIsR0FBRyxJQUFJLEdBQUcsQ0FBK0I7SUFDMUUsc0JBQXNCO0lBQ3RCLG9CQUFvQjtJQUNwQiwwQkFBMEI7SUFDMUIseUJBQXlCO0lBQ3pCLDBCQUEwQjtJQUMxQiwyQkFBMkI7SUFDM0IsbUJBQW1CO0lBQ25CLDhCQUE4QjtJQUM5QiwwQkFBMEI7SUFDMUIsMkJBQTJCO0lBQzNCLDJCQUEyQjtJQUMzQixrQkFBa0I7SUFDbEIsb0JBQW9CO0NBQ3JCLENBQUMsQ0FBQztBQUVILE1BQU0saUNBQWlDLEdBQUcscUNBQXFDLENBQUM7QUFFaEYsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsQ0FDNUMsUUFBaUIsRUFDUCxFQUFFO0lBQ1osTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO0lBQzVCLElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN6RSxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsUUFBbUMsQ0FBQztJQUNsRCxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssMkJBQTJCLEVBQUUsQ0FBQztRQUM3RSxNQUFNLENBQUMsSUFBSSxDQUFDLHlFQUF5RSxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUNELElBQUksT0FBTyxLQUFLLENBQUMsY0FBYyxLQUFLLFFBQVE7V0FDdkMsQ0FBQyxpQ0FBaUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7UUFDbkUsTUFBTSxDQUFDLElBQUksQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFDRCxJQUFJLE9BQU8sS0FBSyxDQUFDLFNBQVMsS0FBSyxRQUFRO1dBQ2xDLENBQUMsaUNBQWlDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQzlELE1BQU0sQ0FBQyxJQUFJLENBQUMsa0RBQWtELENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBQ0QsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ3BELENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWTtRQUNwQixDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2QsSUFBSSxDQUFDLFlBQVk7V0FDWixZQUFZLENBQUMsTUFBTSxHQUFHLENBQUM7V0FDdkIsWUFBWSxDQUFDLE1BQU0sR0FBRyw2QkFBNkIsQ0FBQyxJQUFJO1dBQ3hELElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksS0FBSyxZQUFZLENBQUMsTUFBTTtXQUNsRCxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUN0QyxPQUFPLGFBQWEsS0FBSyxRQUFRO2VBQzlCLENBQUMsNkJBQTZCLENBQUMsR0FBRyxDQUFDLGFBQTZDLENBQUMsQ0FDckYsQ0FBQyxFQUFFLENBQUM7UUFDTCxNQUFNLENBQUMsSUFBSSxDQUFDLGtGQUFrRixDQUFDLENBQUM7SUFDbEcsQ0FBQztJQUNELElBQUksWUFBWSxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUztXQUN4QyxZQUFZLENBQUMsUUFBUSxDQUFDLDhCQUE4QixDQUFDLEVBQUUsQ0FBQztRQUMzRCxNQUFNLENBQUMsSUFBSSxDQUFDLGdFQUFnRSxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUNELElBQUksWUFBWSxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssMkJBQTJCO1dBQzFELENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyw4QkFBOEIsQ0FBQyxFQUFFLENBQUM7UUFDNUQsTUFBTSxDQUFDLElBQUksQ0FBQyx1RUFBdUUsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFDRCxJQUFJLFlBQVksSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVM7V0FDeEMsWUFBWSxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLENBQUM7UUFDeEQsTUFBTSxDQUFDLElBQUksQ0FBQyw4REFBOEQsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUMifQ==
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2RhdGEvdXNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFtREEsTUFBTSw2QkFBNkIsR0FBRyxJQUFJLEdBQUcsQ0FBK0I7SUFDMUUsc0JBQXNCO0lBQ3RCLG9CQUFvQjtJQUNwQiwwQkFBMEI7SUFDMUIseUJBQXlCO0lBQ3pCLDBCQUEwQjtJQUMxQiwyQkFBMkI7SUFDM0IsbUJBQW1CO0lBQ25CLDhCQUE4QjtJQUM5QiwwQkFBMEI7SUFDMUIsMEJBQTBCO0lBQzFCLDJCQUEyQjtJQUMzQiwyQkFBMkI7SUFDM0Isa0JBQWtCO0lBQ2xCLG9CQUFvQjtDQUNyQixDQUFDLENBQUM7QUFFSCxNQUFNLGlDQUFpQyxHQUFHLHFDQUFxQyxDQUFDO0FBRWhGLE1BQU0sQ0FBQyxNQUFNLDhCQUE4QixHQUFHLENBQzVDLFFBQWlCLEVBQ1AsRUFBRTtJQUNaLE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUM1QixJQUFJLENBQUMsUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDekUsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDckMsQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHLFFBQW1DLENBQUM7SUFDbEQsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLDJCQUEyQixFQUFFLENBQUM7UUFDN0UsTUFBTSxDQUFDLElBQUksQ0FBQyx5RUFBeUUsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFDRCxJQUFJLE9BQU8sS0FBSyxDQUFDLGNBQWMsS0FBSyxRQUFRO1dBQ3ZDLENBQUMsaUNBQWlDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1FBQ25FLE1BQU0sQ0FBQyxJQUFJLENBQUMsdURBQXVELENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBQ0QsSUFBSSxPQUFPLEtBQUssQ0FBQyxTQUFTLEtBQUssUUFBUTtXQUNsQyxDQUFDLGlDQUFpQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUM5RCxNQUFNLENBQUMsSUFBSSxDQUFDLGtEQUFrRCxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUNELE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUNwRCxDQUFDLENBQUMsS0FBSyxDQUFDLFlBQVk7UUFDcEIsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNkLElBQUksQ0FBQyxZQUFZO1dBQ1osWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDO1dBQ3ZCLFlBQVksQ0FBQyxNQUFNLEdBQUcsNkJBQTZCLENBQUMsSUFBSTtXQUN4RCxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLE1BQU07V0FDbEQsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FDdEMsT0FBTyxhQUFhLEtBQUssUUFBUTtlQUM5QixDQUFDLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxhQUE2QyxDQUFDLENBQ3JGLENBQUMsRUFBRSxDQUFDO1FBQ0wsTUFBTSxDQUFDLElBQUksQ0FBQyxrRkFBa0YsQ0FBQyxDQUFDO0lBQ2xHLENBQUM7SUFDRCxJQUFJLFlBQVksSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVM7V0FDeEMsWUFBWSxDQUFDLFFBQVEsQ0FBQyw4QkFBOEIsQ0FBQyxFQUFFLENBQUM7UUFDM0QsTUFBTSxDQUFDLElBQUksQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFDRCxJQUFJLFlBQVksSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLDJCQUEyQjtXQUMxRCxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsOEJBQThCLENBQUMsRUFBRSxDQUFDO1FBQzVELE1BQU0sQ0FBQyxJQUFJLENBQUMsdUVBQXVFLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBQ0QsSUFBSSxZQUFZLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTO1dBQ3hDLFlBQVksQ0FBQyxRQUFRLENBQUMsMkJBQTJCLENBQUMsRUFBRSxDQUFDO1FBQ3hELE1BQU0sQ0FBQyxJQUFJLENBQUMsOERBQThELENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBQ0QsSUFBSSxZQUFZLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSywyQkFBMkI7V0FDMUQsWUFBWSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxFQUFFLENBQUM7UUFDdkQsTUFBTSxDQUFDLElBQUksQ0FBQyxzRUFBc0UsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUMifQ==
@@ -9,6 +9,10 @@ import type * as assignmentSecret from '../runtime.assignmentsecret.js';
9
9
  import type * as fleet from '../data/fleetcutover.js';
10
10
  import type { IRuntimeStorageClaim } from '../data/runtimestorageclaim.js';
11
11
  import type * as localStorage from '../data/runtimelocalstorageclaim.js';
12
+ import type * as logs from '../data/runtimeassignmentlogs.js';
13
+ import type * as stats from '../data/runtimeassignmentstats.js';
14
+ import type * as exec from '../data/runtimeassignmentexec.js';
15
+ import type * as volumeArchive from '../data/runtimelocalvolumearchive.js';
12
16
  /** Current-peer, exact-projection authorization; response contains secret keys. */
13
17
  export interface IReq_Pallet_Controller_GetRuntimeManagedVpnCredential extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Pallet_Controller_GetRuntimeManagedVpnCredential> {
14
18
  method: 'getRuntimeManagedVpnCredential';
@@ -161,6 +165,83 @@ export interface IReq_Pallet_Controller_ReportRuntimeAssignmentTerminalReceipt e
161
165
  request: terminal.IReportRuntimeAssignmentTerminalReceiptRequest;
162
166
  response: terminal.IReportRuntimeAssignmentTerminalReceiptResponse;
163
167
  }
168
+ /**
169
+ * Pallet pushes one batch of one attempt's captured output over its current session and sends the
170
+ * next only after this one is acknowledged (`runtimeAssignmentLogContract`). The controller owns
171
+ * log persistence; the node's capture files are disposable transport artifacts.
172
+ */
173
+ export interface IReq_Pallet_Controller_ReportRuntimeAssignmentLogs extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Pallet_Controller_ReportRuntimeAssignmentLogs> {
174
+ method: 'reportRuntimeAssignmentLogs';
175
+ request: logs.IReportRuntimeAssignmentLogsRequest;
176
+ response: logs.IReportRuntimeAssignmentLogsResponse;
177
+ }
178
+ /** Controller read of one resource sample of one attempt, over the node's current session. */
179
+ export interface IReq_Controller_Pallet_ReadRuntimeAssignmentStats extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Controller_Pallet_ReadRuntimeAssignmentStats> {
180
+ method: 'readRuntimeAssignmentStats';
181
+ request: stats.IReadRuntimeAssignmentStatsRequest;
182
+ response: stats.IReadRuntimeAssignmentStatsResponse;
183
+ }
184
+ /**
185
+ * A local controller runs one command in one running attempt's container
186
+ * (`runtimeAssignmentExecContract`). The controller sends standard input on `stdin`, or states
187
+ * `null` for none. The node answers once the process runs: `stdout` carries a `tty` session's
188
+ * whole output, and `stderr` is `null` exactly for a `tty` session. The streams outlive this
189
+ * request and end when the process's output ends or the session ends.
190
+ */
191
+ export interface IReq_Onebox_Pallet_OpenRuntimeAssignmentExec extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Onebox_Pallet_OpenRuntimeAssignmentExec> {
192
+ method: 'openRuntimeAssignmentExec';
193
+ request: {
194
+ exec: exec.IOpenRuntimeAssignmentExecRequest;
195
+ /** Requester sends standard input; the TypedHandler receives the opposite endpoint. */
196
+ stdin: plugins.typedrequestInterfaces.TVirtualStream<'send'> | null;
197
+ };
198
+ response: {
199
+ exec: exec.IOpenRuntimeAssignmentExecResponse;
200
+ /** Requester receives output; the TypedHandler returns sender endpoints. */
201
+ stdout: plugins.typedrequestInterfaces.TVirtualStream<'receive'>;
202
+ stderr: plugins.typedrequestInterfaces.TVirtualStream<'receive'> | null;
203
+ };
204
+ }
205
+ /** A local controller resizes the terminal of one `tty` exec session. */
206
+ export interface IReq_Onebox_Pallet_ResizeRuntimeAssignmentExec extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Onebox_Pallet_ResizeRuntimeAssignmentExec> {
207
+ method: 'resizeRuntimeAssignmentExec';
208
+ request: exec.IResizeRuntimeAssignmentExecRequest;
209
+ response: exec.IResizeRuntimeAssignmentExecResponse;
210
+ }
211
+ /** A local controller ends one exec session, releases its slot and learns how it ended. */
212
+ export interface IReq_Onebox_Pallet_CloseRuntimeAssignmentExec extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Onebox_Pallet_CloseRuntimeAssignmentExec> {
213
+ method: 'closeRuntimeAssignmentExec';
214
+ request: exec.ICloseRuntimeAssignmentExecRequest;
215
+ response: exec.ICloseRuntimeAssignmentExecResponse;
216
+ }
217
+ /**
218
+ * A local controller reads one node-local volume as a pax archive
219
+ * (`runtimeLocalVolumeArchiveContract`). The archive arrives on `archive`, which outlives this
220
+ * request; the node's completion of that stream is the end of the archive.
221
+ */
222
+ export interface IReq_Onebox_Pallet_ReadRuntimeLocalVolumeArchive extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Onebox_Pallet_ReadRuntimeLocalVolumeArchive> {
223
+ method: 'readRuntimeLocalVolumeArchive';
224
+ request: volumeArchive.IReadRuntimeLocalVolumeArchiveRequest;
225
+ response: {
226
+ volume: volumeArchive.IReadRuntimeLocalVolumeArchiveResponse;
227
+ /** Requester receives archive bytes; the TypedHandler returns a sender endpoint. */
228
+ archive: plugins.typedrequestInterfaces.TVirtualStream<'receive'>;
229
+ };
230
+ }
231
+ /**
232
+ * A local controller writes one pax archive as the bytes of an `import` claim waiting in
233
+ * `import-required`. The stream's integrity is `getRuntimeLocalVolumeArchiveIntegrity(volume)`;
234
+ * its acceptance receipt confirms that the node published the volume as `ready`.
235
+ */
236
+ export interface IReq_Onebox_Pallet_WriteRuntimeLocalVolumeArchive extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Onebox_Pallet_WriteRuntimeLocalVolumeArchive> {
237
+ method: 'writeRuntimeLocalVolumeArchive';
238
+ request: {
239
+ volume: volumeArchive.IWriteRuntimeLocalVolumeArchiveRequest;
240
+ /** Requester sends archive bytes; the TypedHandler receives the opposite endpoint. */
241
+ archive: plugins.typedrequestInterfaces.TVirtualStream<'send'>;
242
+ };
243
+ response: volumeArchive.IWriteRuntimeLocalVolumeArchiveResponse;
244
+ }
164
245
  /** Current-peer, exact current assignment authorization; response is secret material. */
165
246
  export interface IReq_Pallet_Controller_GetRuntimeRegistryCredential extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Pallet_Controller_GetRuntimeRegistryCredential> {
166
247
  method: 'getRuntimeRegistryCredential';
@@ -9,6 +9,7 @@ import type { IImageRelease } from '../data/immutableimage.js';
9
9
  import type { IDeploymentPreflightReport, IDeploymentPreflightRequestData } from '../data/deploymentpreflight.js';
10
10
  import type { IDeploymentReservationInput, IServiceDeploymentOperation, IServiceDeploymentStatus } from '../data/deploymentoperation.js';
11
11
  import type { TSha256Digest } from '../data/immutableimage.js';
12
+ import type { ILegacyServiceRuntimeAttestation } from '../data/deploymentlegacyimport.js';
12
13
  import type { IProtocolOffer } from '../protocol.js';
13
14
  import type { IServiceRuntimeAssignmentView, IServiceRuntimeSpec, IServiceRuntimeStatus, TServiceRuntimeSpecWritableData } from '../data/serviceruntime.js';
14
15
  import type { IServiceDeploymentAdoptionInput, IServiceDeploymentAdoptionImagePromotionInput, IServiceDeploymentAdoptionImagePromotionResult, IServiceDeploymentAdoptionRolloutInput, IServiceDeploymentAdoptionRolloutResult, IServiceDeploymentAdoptionPreflightInput, IServiceDeploymentAdoptionReport, IServiceDeploymentAdoptionResult } from '../data/deploymentadoption.js';
@@ -221,6 +222,56 @@ export interface IRequest_Any_Cloudly_CleanupServiceDeployment extends plugins.t
221
222
  operation: IServiceDeploymentOperation;
222
223
  };
223
224
  }
225
+ /**
226
+ * Captures durable evidence that a legacy `deployOnPush` service runs exactly the registry root its
227
+ * tag names: every required replica observed healthy on that one digest, with the root's platform
228
+ * manifests read from Cloudly's own registry. Administrators only, and only while the legacy
229
+ * runtime still runs — incomplete evidence is refused, never stored.
230
+ *
231
+ * `expectedRuntimeDigest`, when stated, is an assertion the observed digest must equal. Capturing
232
+ * again for an unchanged digest returns the attestation already stored.
233
+ */
234
+ export interface IRequest_Any_Cloudly_CaptureLegacyServiceRuntimeAttestation extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IRequest_Any_Cloudly_CaptureLegacyServiceRuntimeAttestation> {
235
+ method: 'captureLegacyServiceRuntimeAttestation';
236
+ request: {
237
+ identity: IIdentityCredential;
238
+ legacyServiceId: string;
239
+ expectedRuntimeDigest?: TSha256Digest;
240
+ };
241
+ response: {
242
+ attestation: ILegacyServiceRuntimeAttestation;
243
+ };
244
+ }
245
+ /** Every attestation Cloudly holds for one legacy service, oldest first. Administrators only. */
246
+ export interface IRequest_Any_Cloudly_GetLegacyServiceRuntimeAttestations extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IRequest_Any_Cloudly_GetLegacyServiceRuntimeAttestations> {
247
+ method: 'getLegacyServiceRuntimeAttestations';
248
+ request: {
249
+ identity: IIdentityCredential;
250
+ legacyServiceId: string;
251
+ };
252
+ response: {
253
+ attestations: ILegacyServiceRuntimeAttestation[];
254
+ };
255
+ }
256
+ /**
257
+ * Imports the attested legacy image of a reserved legacy-import operation into the operation's own
258
+ * repository and release tag. Cloudly does it from its own registry — nothing is pushed — and
259
+ * records release evidence of source `cloudly-legacy-import`; the operation then continues exactly
260
+ * like one whose image was pushed. Replaying it after the import returns the recorded release.
261
+ */
262
+ export interface IRequest_Any_Cloudly_ImportServiceDeploymentLegacyImage extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IRequest_Any_Cloudly_ImportServiceDeploymentLegacyImage> {
263
+ method: 'importServiceDeploymentLegacyImage';
264
+ request: {
265
+ identity: IIdentityCredential;
266
+ serviceId: string;
267
+ operationId: string;
268
+ expectedOperationRevision: number;
269
+ };
270
+ response: {
271
+ operation: IServiceDeploymentOperation;
272
+ release: IImageRelease;
273
+ };
274
+ }
224
275
  export interface IRequest_Any_Cloudly_CreateService extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IRequest_Any_Cloudly_CreateService> {
225
276
  method: 'createService';
226
277
  request: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@serve.zone/interfaces",
3
- "version": "32.35.0",
3
+ "version": "32.36.1",
4
4
  "private": false,
5
5
  "description": "Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.",
6
6
  "exports": {