@serve.zone/interfaces 30.0.0 → 30.1.0
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/changelog.md +9 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/data/index.d.ts +1 -0
- package/dist_ts/data/index.js +2 -1
- package/dist_ts/data/runtimesession.d.ts +15 -0
- package/dist_ts/data/runtimesession.js +26 -13
- package/dist_ts/data/runtimeterminalreceipt.d.ts +97 -0
- package/dist_ts/data/runtimeterminalreceipt.js +281 -0
- package/dist_ts/requests/runtimesession.d.ts +7 -0
- package/package.json +1 -1
- package/readme.md +35 -0
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/data/index.ts +1 -0
- package/ts/data/runtimesession.ts +38 -12
- package/ts/data/runtimeterminalreceipt.ts +338 -0
- package/ts/requests/runtimesession.ts +11 -0
package/changelog.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026-09-09 - 30.1.0
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- add runtime assignment terminal receipt contracts (runtime-terminal-receipts)
|
|
8
|
+
- Add terminal receipt interfaces, canonical digest helpers, validation, CAS evaluation, and report binding helpers.
|
|
9
|
+
- Expose the terminal receipt data module and add a TypedRequest contract for reporting receipts.
|
|
10
|
+
- Document joined stop/remove receipt semantics and add tests covering digest stability, validation, replay, and reporter binding.
|
|
11
|
+
|
|
3
12
|
## 2026-09-09 - 30.0.0
|
|
4
13
|
|
|
5
14
|
### Breaking Changes
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@serve.zone/interfaces',
|
|
6
|
-
version: '30.
|
|
6
|
+
version: '30.1.0',
|
|
7
7
|
description: 'Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLHVGQUF1RjtDQUNyRyxDQUFBIn0=
|
package/dist_ts/data/index.d.ts
CHANGED
|
@@ -26,6 +26,7 @@ export * from './registry.js';
|
|
|
26
26
|
export * from './runtimeassignment.js';
|
|
27
27
|
export * from './runtimeconfig.js';
|
|
28
28
|
export * from './runtimesession.js';
|
|
29
|
+
export * from './runtimeterminalreceipt.js';
|
|
29
30
|
export * from './secret.js';
|
|
30
31
|
export * from './baremetal.js';
|
|
31
32
|
export * from './baseos.js';
|
package/dist_ts/data/index.js
CHANGED
|
@@ -26,6 +26,7 @@ export * from './registry.js';
|
|
|
26
26
|
export * from './runtimeassignment.js';
|
|
27
27
|
export * from './runtimeconfig.js';
|
|
28
28
|
export * from './runtimesession.js';
|
|
29
|
+
export * from './runtimeterminalreceipt.js';
|
|
29
30
|
export * from './secret.js';
|
|
30
31
|
export * from './baremetal.js';
|
|
31
32
|
export * from './baseos.js';
|
|
@@ -40,4 +41,4 @@ export * from './traffic.js';
|
|
|
40
41
|
export * from './user.js';
|
|
41
42
|
export * from './version.js';
|
|
42
43
|
export * from './webpush.js';
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxjQUFjLENBQUMifQ==
|
|
@@ -44,6 +44,13 @@ export interface IReportRuntimeAssignmentObservationRequestV1 {
|
|
|
44
44
|
observation: IRuntimeAssignmentObservationV1;
|
|
45
45
|
}
|
|
46
46
|
export type TRuntimeObservationAuthorityUseV1 = 'current-session' | 'historical-recovery';
|
|
47
|
+
/** Content comparison result only; all supplied authority must come from its trusted owner. */
|
|
48
|
+
export interface IRuntimeReporterSessionBindingV1 {
|
|
49
|
+
session: IRuntimeSessionBindingV1;
|
|
50
|
+
assignment: IRuntimeAssignmentV1;
|
|
51
|
+
reporterHistory: IRuntimeSessionBindingV1;
|
|
52
|
+
authorityUse: TRuntimeObservationAuthorityUseV1;
|
|
53
|
+
}
|
|
47
54
|
export interface IReportRuntimeAssignmentObservationResponseV1 {
|
|
48
55
|
/** Exact request body after a durable sequence/receipt transaction. */
|
|
49
56
|
observation: IRuntimeAssignmentObservationV1;
|
|
@@ -106,6 +113,14 @@ export declare const bindGetRuntimeRegistryCredentialResponseV1: (valueArg: unkn
|
|
|
106
113
|
export declare const bindApplyRuntimeAssignmentRequestV1: (valueArg: unknown, trustedSessionArg: unknown) => Promise<IApplyRuntimeAssignmentRequestV1>;
|
|
107
114
|
/** Match an admission acknowledgement to the exact sent revision, including historical replies. */
|
|
108
115
|
export declare const bindApplyRuntimeAssignmentResponseV1: (valueArg: unknown, requestArg: unknown) => IApplyRuntimeAssignmentResponseV1;
|
|
116
|
+
/**
|
|
117
|
+
* Synchronous detached content binding, not authentication. trustedSessionArg must
|
|
118
|
+
* be the CURRENT authenticated physical peer; reporterHistoryArg must be immutable
|
|
119
|
+
* server-indexed Pallet-purpose history. Never obtain either from request fields.
|
|
120
|
+
* The owning transaction must recheck current credential/peer authority. Assignment
|
|
121
|
+
* digest validation and report-specific authority remain the caller's responsibility.
|
|
122
|
+
*/
|
|
123
|
+
export declare const bindRuntimeReporterSessionV1: (sessionArg: unknown, reporterSessionIdArg: string, assignmentArg: unknown, trustedSessionArg: unknown, reporterHistoryArg: unknown) => IRuntimeReporterSessionBindingV1;
|
|
109
124
|
/**
|
|
110
125
|
* trustedSessionArg is the CURRENT authenticated physical peer. reporterHistoryArg
|
|
111
126
|
* must be server-indexed immutable session history, obtained by the original
|
|
@@ -216,6 +216,28 @@ export const bindApplyRuntimeAssignmentResponseV1 = (valueArg, requestArg) => sa
|
|
|
216
216
|
requireValue(canonical(response.assignment) === canonical(getRuntimeAssignmentV1Reference(request.assignment)));
|
|
217
217
|
return response;
|
|
218
218
|
});
|
|
219
|
+
/**
|
|
220
|
+
* Synchronous detached content binding, not authentication. trustedSessionArg must
|
|
221
|
+
* be the CURRENT authenticated physical peer; reporterHistoryArg must be immutable
|
|
222
|
+
* server-indexed Pallet-purpose history. Never obtain either from request fields.
|
|
223
|
+
* The owning transaction must recheck current credential/peer authority. Assignment
|
|
224
|
+
* digest validation and report-specific authority remain the caller's responsibility.
|
|
225
|
+
*/
|
|
226
|
+
export const bindRuntimeReporterSessionV1 = (sessionArg, reporterSessionIdArg, assignmentArg, trustedSessionArg, reporterHistoryArg) => safe(() => {
|
|
227
|
+
const incomingSession = snapshotRuntimeSessionBindingV1(sessionArg);
|
|
228
|
+
const reporterSessionId = identifier(reporterSessionIdArg);
|
|
229
|
+
const assignment = snapshotRuntimeAssignmentV1(capture(assignmentArg));
|
|
230
|
+
const trustedSession = snapshotRuntimeSessionBindingV1(trustedSessionArg);
|
|
231
|
+
const reporterHistory = snapshotRuntimeSessionBindingV1(reporterHistoryArg);
|
|
232
|
+
requireValue(sameSession(incomingSession, trustedSession) && matchesAssignment(trustedSession, assignment)
|
|
233
|
+
&& reporterSessionId === reporterHistory.reporterSessionId && sameOwner(trustedSession, reporterHistory));
|
|
234
|
+
const current = sameSession(reporterHistory, trustedSession);
|
|
235
|
+
requireValue(current || (reporterHistory.reporterSessionId !== trustedSession.reporterSessionId
|
|
236
|
+
&& reporterHistory.sessionEpoch < trustedSession.sessionEpoch
|
|
237
|
+
&& reporterHistory.credentialGeneration <= trustedSession.credentialGeneration));
|
|
238
|
+
return { session: incomingSession, assignment, reporterHistory,
|
|
239
|
+
authorityUse: current ? 'current-session' : 'historical-recovery' };
|
|
240
|
+
});
|
|
219
241
|
/**
|
|
220
242
|
* trustedSessionArg is the CURRENT authenticated physical peer. reporterHistoryArg
|
|
221
243
|
* must be server-indexed immutable session history, obtained by the original
|
|
@@ -230,18 +252,9 @@ export const bindApplyRuntimeAssignmentResponseV1 = (valueArg, requestArg) => sa
|
|
|
230
252
|
export const bindReportRuntimeAssignmentObservationRequestV1 = async (valueArg, assignmentArg, trustedSessionArg, reporterHistoryArg) => {
|
|
231
253
|
try {
|
|
232
254
|
const request = snapshotReportRuntimeAssignmentObservationRequestV1(valueArg);
|
|
233
|
-
const
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
requireValue(sameSession(request.session, trustedSession) && matchesAssignment(trustedSession, assignment)
|
|
237
|
-
&& request.observation.reporterSessionId === reporterHistory.reporterSessionId
|
|
238
|
-
&& sameOwner(trustedSession, reporterHistory));
|
|
239
|
-
const current = sameSession(reporterHistory, trustedSession);
|
|
240
|
-
requireValue(current || (reporterHistory.reporterSessionId !== trustedSession.reporterSessionId
|
|
241
|
-
&& reporterHistory.sessionEpoch < trustedSession.sessionEpoch
|
|
242
|
-
&& reporterHistory.credentialGeneration <= trustedSession.credentialGeneration));
|
|
243
|
-
requireValue((await validateRuntimeAssignmentObservationV1(request.observation, assignment)).length === 0);
|
|
244
|
-
return { request, authorityUse: current ? 'current-session' : 'historical-recovery' };
|
|
255
|
+
const binding = bindRuntimeReporterSessionV1(request.session, request.observation.reporterSessionId, assignmentArg, trustedSessionArg, reporterHistoryArg);
|
|
256
|
+
requireValue((await validateRuntimeAssignmentObservationV1(request.observation, binding.assignment)).length === 0);
|
|
257
|
+
return { request, authorityUse: binding.authorityUse };
|
|
245
258
|
}
|
|
246
259
|
catch {
|
|
247
260
|
return fail();
|
|
@@ -272,4 +285,4 @@ export const bindGetRuntimeRegistryCredentialRequestV1 = async (valueArg, assign
|
|
|
272
285
|
return fail();
|
|
273
286
|
}
|
|
274
287
|
};
|
|
275
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZXNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL3J1bnRpbWVzZXNzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUtyRCxPQUFPLEVBQ0wsK0JBQStCLEVBQUUsc0NBQXNDLEVBQ3ZFLDJCQUEyQixFQUFFLHNDQUFzQyxFQUFFLDJCQUEyQixHQUNqRyxNQUFNLHdCQUF3QixDQUFDO0FBRWhDLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBdUZyRSxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3BELHlCQUF5QixFQUFFLE9BQU87SUFDbEMsc0JBQXNCLEVBQUUsTUFBTTtJQUM5Qiw0QkFBNEIsRUFBRSxJQUFJO0lBQ2xDLGlCQUFpQixFQUFFLHlEQUF5RDtJQUM1RSw4QkFBOEIsRUFBRSw4QkFBOEI7SUFDOUQsS0FBSyxFQUFFLG9DQUFvQztDQUNuQyxDQUFDLENBQUM7QUFFWixNQUFNLElBQUksR0FBRyxHQUFVLEVBQUUsR0FBRyxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9FLFNBQVMsWUFBWSxDQUFDLFlBQXFCO0lBQ3pDLElBQUksQ0FBQyxZQUFZO1FBQUUsSUFBSSxFQUFFLENBQUM7QUFDNUIsQ0FBQztBQUNELE1BQU0sSUFBSSxHQUFHLENBQUksWUFBcUIsRUFBSyxFQUFFO0lBQzNDLElBQUksQ0FBQztRQUFDLE9BQU8sWUFBWSxFQUFFLENBQUM7SUFBQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUFDLENBQUM7QUFDekQs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
|
|
288
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZXNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL3J1bnRpbWVzZXNzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUtyRCxPQUFPLEVBQ0wsK0JBQStCLEVBQUUsc0NBQXNDLEVBQ3ZFLDJCQUEyQixFQUFFLHNDQUFzQyxFQUFFLDJCQUEyQixHQUNqRyxNQUFNLHdCQUF3QixDQUFDO0FBRWhDLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBK0ZyRSxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3BELHlCQUF5QixFQUFFLE9BQU87SUFDbEMsc0JBQXNCLEVBQUUsTUFBTTtJQUM5Qiw0QkFBNEIsRUFBRSxJQUFJO0lBQ2xDLGlCQUFpQixFQUFFLHlEQUF5RDtJQUM1RSw4QkFBOEIsRUFBRSw4QkFBOEI7SUFDOUQsS0FBSyxFQUFFLG9DQUFvQztDQUNuQyxDQUFDLENBQUM7QUFFWixNQUFNLElBQUksR0FBRyxHQUFVLEVBQUUsR0FBRyxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9FLFNBQVMsWUFBWSxDQUFDLFlBQXFCO0lBQ3pDLElBQUksQ0FBQyxZQUFZO1FBQUUsSUFBSSxFQUFFLENBQUM7QUFDNUIsQ0FBQztBQUNELE1BQU0sSUFBSSxHQUFHLENBQUksWUFBcUIsRUFBSyxFQUFFO0lBQzNDLElBQUksQ0FBQztRQUFDLE9BQU8sWUFBWSxFQUFFLENBQUM7SUFBQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUFDLENBQUM7QUFDekQs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
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import type { TSha256Digest } from './immutableimage.js';
|
|
2
|
+
import type { IRuntimeAssignmentReferenceV1 } from './runtimeassignment.js';
|
|
3
|
+
import type { IRuntimeSessionBindingV1, TRuntimeObservationAuthorityUseV1 } from './runtimesession.js';
|
|
4
|
+
/** Exact value-free native terminal evidence; terminal inspection does not collect addresses. */
|
|
5
|
+
export interface IRuntimeAssignmentTerminalEvidenceV1 {
|
|
6
|
+
phase: 'stopped' | 'absent';
|
|
7
|
+
sandboxId: string | null;
|
|
8
|
+
containerId: string | null;
|
|
9
|
+
imageConfigDigest: TSha256Digest | null;
|
|
10
|
+
/** Exactly empty for the qualified native stop/remove path; no route evidence. */
|
|
11
|
+
ipAddresses: string[];
|
|
12
|
+
exitCode: number | null;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Qualified only when the named Pallet owner has durably joined this exact native
|
|
16
|
+
* operation. Structure and digest alone do not prove that join. Pending, unknown
|
|
17
|
+
* and host-fenced journal entries can never issue this receipt. A new boot permits
|
|
18
|
+
* a new joined terminal operation; it cannot replace the stop/remove chain.
|
|
19
|
+
*
|
|
20
|
+
* This settles only the named Pallet attempt. It grants no readiness, routing,
|
|
21
|
+
* liveness, storage relocation, whole-host, Docker/Coreflow absence, other
|
|
22
|
+
* controller or cross-organization authority. It has no authoritative wall clock.
|
|
23
|
+
*/
|
|
24
|
+
export interface IRuntimeAssignmentTerminalReceiptV1 {
|
|
25
|
+
schemaVersion: 1;
|
|
26
|
+
/** Exact generation 2 stop or generation 3 remove revision. */
|
|
27
|
+
assignment: IRuntimeAssignmentReferenceV1;
|
|
28
|
+
/** Exact immutable generation 1 run revision. */
|
|
29
|
+
runAssignment: IRuntimeAssignmentReferenceV1;
|
|
30
|
+
reporterSessionId: string;
|
|
31
|
+
sequence: 1 | 2;
|
|
32
|
+
operation: {
|
|
33
|
+
id: string;
|
|
34
|
+
action: 'stop' | 'remove';
|
|
35
|
+
bootId: string;
|
|
36
|
+
status: 'completed';
|
|
37
|
+
evidence: IRuntimeAssignmentTerminalEvidenceV1;
|
|
38
|
+
};
|
|
39
|
+
/** Null for stop; the exact accepted stop receipt digest for remove. */
|
|
40
|
+
previousReceiptDigest: TSha256Digest | null;
|
|
41
|
+
digest: TSha256Digest;
|
|
42
|
+
}
|
|
43
|
+
export interface IReportRuntimeAssignmentTerminalReceiptRequestV1 {
|
|
44
|
+
/** Current physical peer binding, even when the immutable receipt is historical. */
|
|
45
|
+
session: IRuntimeSessionBindingV1;
|
|
46
|
+
receipt: IRuntimeAssignmentTerminalReceiptV1;
|
|
47
|
+
}
|
|
48
|
+
export interface IReportRuntimeAssignmentTerminalReceiptResponseV1 {
|
|
49
|
+
/** Exact immutable body after the owning durable receipt transaction. */
|
|
50
|
+
receipt: IRuntimeAssignmentTerminalReceiptV1;
|
|
51
|
+
/** Historical recovery never restores active readiness, routes or liveness. */
|
|
52
|
+
authorityUse: TRuntimeObservationAuthorityUseV1;
|
|
53
|
+
}
|
|
54
|
+
export type TRuntimeAssignmentTerminalReceiptDecisionV1 = {
|
|
55
|
+
status: 'accept' | 'replay';
|
|
56
|
+
receipt: IRuntimeAssignmentTerminalReceiptV1;
|
|
57
|
+
} | {
|
|
58
|
+
status: 'reject';
|
|
59
|
+
reason: 'invalid' | 'conflict' | 'sequence-gap' | 'predecessor-mismatch';
|
|
60
|
+
};
|
|
61
|
+
export declare const runtimeAssignmentTerminalReceiptV1Contract: Readonly<{
|
|
62
|
+
readonly digestDomain: "serve.zone/runtime-assignment-terminal-receipt-v1";
|
|
63
|
+
readonly maximumReceiptCanonicalBytes: 16384;
|
|
64
|
+
readonly maximumHistoryCanonicalBytes: 98304;
|
|
65
|
+
readonly maximumReceipts: 2;
|
|
66
|
+
readonly maximumAssignmentRevisions: 3;
|
|
67
|
+
readonly error: "Runtime terminal receipt contract rejected.";
|
|
68
|
+
}>;
|
|
69
|
+
/** Detached exact-schema assertion only; digest, journal provenance and authority remain unverified. */
|
|
70
|
+
export declare const snapshotRuntimeAssignmentTerminalReceiptV1: (valueArg: unknown) => IRuntimeAssignmentTerminalReceiptV1;
|
|
71
|
+
/** Bounded exact receipt history for synchronous persistence assertions; hashes remain unchecked. */
|
|
72
|
+
export declare const snapshotRuntimeAssignmentTerminalReceiptHistoryV1: (valueArg: unknown) => IRuntimeAssignmentTerminalReceiptV1[];
|
|
73
|
+
/** Domain-separated exact body digest; captures before asynchronous hashing. */
|
|
74
|
+
export declare const computeRuntimeAssignmentTerminalReceiptV1Digest: (valueArg: IRuntimeAssignmentTerminalReceiptV1) => Promise<TSha256Digest>;
|
|
75
|
+
/** Full immutable run/stop/remove chain and exact prior stop receipt are mandatory for removal. */
|
|
76
|
+
export declare const validateRuntimeAssignmentTerminalReceiptV1: (valueArg: unknown, assignmentHistoryArg: unknown, previousReceiptArg: unknown) => Promise<string[]>;
|
|
77
|
+
/**
|
|
78
|
+
* Pure bounded CAS decision. Persist under the owning transaction and current
|
|
79
|
+
* credential/peer fence. New acceptance also requires the exact global incumbent;
|
|
80
|
+
* only a previously persisted exact body can replay after the incumbent changes.
|
|
81
|
+
* The helper cannot prove either condition. Retain both bodies after removal.
|
|
82
|
+
*/
|
|
83
|
+
export declare const evaluateRuntimeAssignmentTerminalReceiptV1: (valueArg: unknown, acceptedHistoryArg: unknown, assignmentHistoryArg: unknown) => Promise<TRuntimeAssignmentTerminalReceiptDecisionV1>;
|
|
84
|
+
export declare const snapshotReportRuntimeAssignmentTerminalReceiptRequestV1: (valueArg: unknown) => IReportRuntimeAssignmentTerminalReceiptRequestV1;
|
|
85
|
+
export declare const snapshotReportRuntimeAssignmentTerminalReceiptResponseV1: (valueArg: unknown) => IReportRuntimeAssignmentTerminalReceiptResponseV1;
|
|
86
|
+
/**
|
|
87
|
+
* CURRENT physical session and immutable server-indexed reporter history are
|
|
88
|
+
* trusted owner inputs, never wire claims. The previous stop receipt must also
|
|
89
|
+
* come from the durable owner. This binds content; it does not authenticate,
|
|
90
|
+
* prove the local operation join, advance CAS, or admit a replacement.
|
|
91
|
+
*/
|
|
92
|
+
export declare const bindReportRuntimeAssignmentTerminalReceiptRequestV1: (valueArg: unknown, assignmentHistoryArg: unknown, previousReceiptArg: unknown, trustedSessionArg: unknown, reporterHistoryArg: unknown) => Promise<{
|
|
93
|
+
request: IReportRuntimeAssignmentTerminalReceiptRequestV1;
|
|
94
|
+
authorityUse: TRuntimeObservationAuthorityUseV1;
|
|
95
|
+
}>;
|
|
96
|
+
/** Exact ACK of the immutable outbox body; no rewritten session, operation or chain. */
|
|
97
|
+
export declare const bindReportRuntimeAssignmentTerminalReceiptResponseV1: (valueArg: unknown, requestArg: unknown) => IReportRuntimeAssignmentTerminalReceiptResponseV1;
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import { isSha256Digest } from './immutableimage.js';
|
|
2
|
+
import { evaluateRuntimeAssignmentV1, getRuntimeAssignmentV1Reference, snapshotRuntimeAssignmentV1 } from './runtimeassignment.js';
|
|
3
|
+
import { bindRuntimeReporterSessionV1, snapshotRuntimeSessionBindingV1 } from './runtimesession.js';
|
|
4
|
+
import { canonicalizeStrictJson, createCanonicalJsonSha256Hex } from '../private/canonicaljson.js';
|
|
5
|
+
export const runtimeAssignmentTerminalReceiptV1Contract = Object.freeze({
|
|
6
|
+
digestDomain: 'serve.zone/runtime-assignment-terminal-receipt-v1',
|
|
7
|
+
maximumReceiptCanonicalBytes: 16_384,
|
|
8
|
+
maximumHistoryCanonicalBytes: 98_304,
|
|
9
|
+
maximumReceipts: 2,
|
|
10
|
+
maximumAssignmentRevisions: 3,
|
|
11
|
+
error: 'Runtime terminal receipt contract rejected.',
|
|
12
|
+
});
|
|
13
|
+
const fail = () => { throw new Error(runtimeAssignmentTerminalReceiptV1Contract.error); };
|
|
14
|
+
function requireValue(conditionArg) { if (!conditionArg)
|
|
15
|
+
fail(); }
|
|
16
|
+
const safe = (operationArg) => { try {
|
|
17
|
+
return operationArg();
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return fail();
|
|
21
|
+
} };
|
|
22
|
+
const canonical = (valueArg) => canonicalizeStrictJson(valueArg, fail);
|
|
23
|
+
const encoder = new TextEncoder();
|
|
24
|
+
const identifier = (valueArg) => {
|
|
25
|
+
requireValue(typeof valueArg === 'string' && /^[A-Za-z0-9][A-Za-z0-9:._-]{0,199}$/.test(valueArg));
|
|
26
|
+
return valueArg;
|
|
27
|
+
};
|
|
28
|
+
const digest = (valueArg) => {
|
|
29
|
+
requireValue(typeof valueArg === 'string' && isSha256Digest(valueArg));
|
|
30
|
+
return valueArg;
|
|
31
|
+
};
|
|
32
|
+
/** Bounded inert copy before hashing or calling any nested validator. */
|
|
33
|
+
const capture = (valueArg, maximumBytesArg = runtimeAssignmentTerminalReceiptV1Contract.maximumHistoryCanonicalBytes) => safe(() => {
|
|
34
|
+
let nodes = 0;
|
|
35
|
+
let bytes = 0;
|
|
36
|
+
const ancestors = new Set();
|
|
37
|
+
const account = (value) => {
|
|
38
|
+
requireValue(value.length <= maximumBytesArg);
|
|
39
|
+
bytes += encoder.encode(value).byteLength;
|
|
40
|
+
requireValue(bytes <= maximumBytesArg);
|
|
41
|
+
};
|
|
42
|
+
const copy = (value, depth) => {
|
|
43
|
+
requireValue(++nodes <= 4096 && depth <= 12);
|
|
44
|
+
if (typeof value === 'string') {
|
|
45
|
+
account(value);
|
|
46
|
+
return value;
|
|
47
|
+
}
|
|
48
|
+
if (value === null || typeof value === 'boolean' || typeof value === 'number')
|
|
49
|
+
return value;
|
|
50
|
+
requireValue(value !== null && typeof value === 'object' && !ancestors.has(value));
|
|
51
|
+
const array = Array.isArray(value);
|
|
52
|
+
const prototype = Object.getPrototypeOf(value);
|
|
53
|
+
requireValue(array ? prototype === Array.prototype : prototype === Object.prototype || prototype === null);
|
|
54
|
+
ancestors.add(value);
|
|
55
|
+
try {
|
|
56
|
+
const keys = Reflect.ownKeys(value);
|
|
57
|
+
requireValue(keys.length <= 65);
|
|
58
|
+
if (array) {
|
|
59
|
+
const length = Object.getOwnPropertyDescriptor(value, 'length')?.value;
|
|
60
|
+
requireValue(Number.isSafeInteger(length) && length >= 0 && length <= 64 && keys.length === length + 1);
|
|
61
|
+
const result = [];
|
|
62
|
+
for (let index = 0; index < length; index++) {
|
|
63
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
|
|
64
|
+
requireValue(descriptor?.enumerable && Object.hasOwn(descriptor, 'value'));
|
|
65
|
+
result.push(copy(descriptor.value, depth + 1));
|
|
66
|
+
}
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
const result = Object.create(null);
|
|
70
|
+
for (const key of keys) {
|
|
71
|
+
requireValue(typeof key === 'string');
|
|
72
|
+
account(key);
|
|
73
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
74
|
+
requireValue(descriptor?.enumerable && Object.hasOwn(descriptor, 'value'));
|
|
75
|
+
result[key] = copy(descriptor.value, depth + 1);
|
|
76
|
+
}
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
ancestors.delete(value);
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
const serialized = canonical(copy(valueArg, 0));
|
|
84
|
+
requireValue(encoder.encode(serialized).byteLength <= maximumBytesArg);
|
|
85
|
+
return JSON.parse(serialized);
|
|
86
|
+
});
|
|
87
|
+
const record = (valueArg, keysArg) => {
|
|
88
|
+
requireValue(valueArg !== null && typeof valueArg === 'object' && !Array.isArray(valueArg));
|
|
89
|
+
const keys = Object.keys(valueArg);
|
|
90
|
+
requireValue(keys.length === keysArg.length && keys.every((key) => keysArg.includes(key)));
|
|
91
|
+
return valueArg;
|
|
92
|
+
};
|
|
93
|
+
const reference = (valueArg) => {
|
|
94
|
+
const value = record(valueArg, ['assignmentId', 'generation', 'digest']);
|
|
95
|
+
requireValue(typeof value.generation === 'number' && Number.isSafeInteger(value.generation)
|
|
96
|
+
&& value.generation >= 1 && value.generation <= 3);
|
|
97
|
+
return { assignmentId: identifier(value.assignmentId), generation: value.generation, digest: digest(value.digest) };
|
|
98
|
+
};
|
|
99
|
+
const evidence = (valueArg) => {
|
|
100
|
+
const value = record(valueArg, ['phase', 'sandboxId', 'containerId', 'imageConfigDigest', 'ipAddresses', 'exitCode']);
|
|
101
|
+
requireValue(value.phase === 'absent' || value.phase === 'stopped');
|
|
102
|
+
for (const field of ['sandboxId', 'containerId'])
|
|
103
|
+
requireValue(value[field] === null
|
|
104
|
+
|| (typeof value[field] === 'string' && /^[a-f0-9]{64}$/.test(value[field])));
|
|
105
|
+
requireValue(value.imageConfigDigest === null || (typeof value.imageConfigDigest === 'string'
|
|
106
|
+
&& isSha256Digest(value.imageConfigDigest)));
|
|
107
|
+
requireValue(Array.isArray(value.ipAddresses) && value.ipAddresses.length === 0);
|
|
108
|
+
requireValue(value.exitCode === null || (typeof value.exitCode === 'number' && Number.isSafeInteger(value.exitCode)
|
|
109
|
+
&& value.exitCode >= -2_147_483_648 && value.exitCode <= 2_147_483_647));
|
|
110
|
+
requireValue(value.phase === 'absent'
|
|
111
|
+
? value.sandboxId === null && value.containerId === null && value.imageConfigDigest === null && value.exitCode === null
|
|
112
|
+
: value.sandboxId !== null);
|
|
113
|
+
requireValue(value.containerId !== null || (value.imageConfigDigest === null && value.exitCode === null));
|
|
114
|
+
return value;
|
|
115
|
+
};
|
|
116
|
+
/** Detached exact-schema assertion only; digest, journal provenance and authority remain unverified. */
|
|
117
|
+
export const snapshotRuntimeAssignmentTerminalReceiptV1 = (valueArg) => safe(() => {
|
|
118
|
+
const value = record(capture(valueArg, runtimeAssignmentTerminalReceiptV1Contract.maximumReceiptCanonicalBytes), ['schemaVersion', 'assignment', 'runAssignment', 'reporterSessionId', 'sequence', 'operation', 'previousReceiptDigest', 'digest']);
|
|
119
|
+
const assignment = reference(value.assignment);
|
|
120
|
+
const runAssignment = reference(value.runAssignment);
|
|
121
|
+
const operation = record(value.operation, ['id', 'action', 'bootId', 'status', 'evidence']);
|
|
122
|
+
const terminalEvidence = evidence(operation.evidence);
|
|
123
|
+
requireValue(value.schemaVersion === 1 && (value.sequence === 1 || value.sequence === 2)
|
|
124
|
+
&& operation.status === 'completed' && assignment.generation === value.sequence + 1
|
|
125
|
+
&& runAssignment.generation === 1 && runAssignment.assignmentId === assignment.assignmentId);
|
|
126
|
+
requireValue(typeof operation.bootId === 'string'
|
|
127
|
+
&& /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/.test(operation.bootId));
|
|
128
|
+
requireValue(value.sequence === 1 ? operation.action === 'stop' && value.previousReceiptDigest === null
|
|
129
|
+
: operation.action === 'remove' && terminalEvidence.phase === 'absent' && value.previousReceiptDigest !== null);
|
|
130
|
+
return { schemaVersion: 1, assignment, runAssignment, reporterSessionId: identifier(value.reporterSessionId),
|
|
131
|
+
sequence: value.sequence, operation: { id: identifier(operation.id), action: operation.action,
|
|
132
|
+
bootId: operation.bootId, status: 'completed', evidence: terminalEvidence },
|
|
133
|
+
previousReceiptDigest: value.previousReceiptDigest === null ? null : digest(value.previousReceiptDigest), digest: digest(value.digest) };
|
|
134
|
+
});
|
|
135
|
+
/** Bounded exact receipt history for synchronous persistence assertions; hashes remain unchecked. */
|
|
136
|
+
export const snapshotRuntimeAssignmentTerminalReceiptHistoryV1 = (valueArg) => safe(() => {
|
|
137
|
+
const values = capture(valueArg);
|
|
138
|
+
requireValue(Array.isArray(values) && values.length <= runtimeAssignmentTerminalReceiptV1Contract.maximumReceipts);
|
|
139
|
+
const receipts = values.map(snapshotRuntimeAssignmentTerminalReceiptV1);
|
|
140
|
+
for (const [index, receipt] of receipts.entries()) {
|
|
141
|
+
requireValue(receipt.sequence === index + 1);
|
|
142
|
+
if (index > 0)
|
|
143
|
+
requireValue(receipt.previousReceiptDigest === receipts[0].digest
|
|
144
|
+
&& canonical(receipt.runAssignment) === canonical(receipts[0].runAssignment)
|
|
145
|
+
&& receipt.operation.id !== receipts[0].operation.id);
|
|
146
|
+
}
|
|
147
|
+
return receipts;
|
|
148
|
+
});
|
|
149
|
+
const assignments = (valueArg) => {
|
|
150
|
+
const values = capture(valueArg);
|
|
151
|
+
requireValue(Array.isArray(values) && values.length >= 2
|
|
152
|
+
&& values.length <= runtimeAssignmentTerminalReceiptV1Contract.maximumAssignmentRevisions);
|
|
153
|
+
return values.map(snapshotRuntimeAssignmentV1);
|
|
154
|
+
};
|
|
155
|
+
const checkAssignmentHistory = async (historyArg) => {
|
|
156
|
+
const run = historyArg[0];
|
|
157
|
+
const scope = { controller: run.controller, organizationId: run.organizationId,
|
|
158
|
+
nodeId: run.nodeId, runtimeNamespace: run.runtimeNamespace };
|
|
159
|
+
for (const [index, assignment] of historyArg.entries()) {
|
|
160
|
+
requireValue(assignment.generation === index + 1
|
|
161
|
+
&& assignment.disposition === ['run', 'stop-preserve', 'remove-runtime-preserve-storage'][index]);
|
|
162
|
+
requireValue((await evaluateRuntimeAssignmentV1(assignment, index === 0 ? null : historyArg[index - 1], scope)).status === 'accept');
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
const computeSnapshotDigest = async (receiptArg) => {
|
|
166
|
+
const { digest: _digest, ...payload } = receiptArg;
|
|
167
|
+
return `sha256:${await createCanonicalJsonSha256Hex(canonical({
|
|
168
|
+
domain: runtimeAssignmentTerminalReceiptV1Contract.digestDomain, payload,
|
|
169
|
+
}), fail)}`;
|
|
170
|
+
};
|
|
171
|
+
/** Domain-separated exact body digest; captures before asynchronous hashing. */
|
|
172
|
+
export const computeRuntimeAssignmentTerminalReceiptV1Digest = async (valueArg) => {
|
|
173
|
+
try {
|
|
174
|
+
return await computeSnapshotDigest(snapshotRuntimeAssignmentTerminalReceiptV1(valueArg));
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
return fail();
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
const checkReceipt = async (receiptArg, historyArg, previousArg) => {
|
|
181
|
+
requireValue(historyArg.length > receiptArg.sequence
|
|
182
|
+
&& canonical(receiptArg.runAssignment) === canonical(getRuntimeAssignmentV1Reference(historyArg[0]))
|
|
183
|
+
&& canonical(receiptArg.assignment) === canonical(getRuntimeAssignmentV1Reference(historyArg[receiptArg.sequence]))
|
|
184
|
+
&& receiptArg.digest === await computeSnapshotDigest(receiptArg));
|
|
185
|
+
if (receiptArg.sequence === 1)
|
|
186
|
+
requireValue(previousArg === null);
|
|
187
|
+
else {
|
|
188
|
+
requireValue(previousArg !== null && previousArg.sequence === 1);
|
|
189
|
+
await checkReceipt(previousArg, historyArg, null);
|
|
190
|
+
requireValue(receiptArg.previousReceiptDigest === previousArg.digest && receiptArg.operation.id !== previousArg.operation.id);
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
/** Full immutable run/stop/remove chain and exact prior stop receipt are mandatory for removal. */
|
|
194
|
+
export const validateRuntimeAssignmentTerminalReceiptV1 = async (valueArg, assignmentHistoryArg, previousReceiptArg) => {
|
|
195
|
+
try {
|
|
196
|
+
const receipt = snapshotRuntimeAssignmentTerminalReceiptV1(valueArg);
|
|
197
|
+
const history = assignments(assignmentHistoryArg);
|
|
198
|
+
const previous = previousReceiptArg === null ? null : snapshotRuntimeAssignmentTerminalReceiptV1(previousReceiptArg);
|
|
199
|
+
await checkAssignmentHistory(history);
|
|
200
|
+
await checkReceipt(receipt, history, previous);
|
|
201
|
+
return [];
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
return [runtimeAssignmentTerminalReceiptV1Contract.error];
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
/**
|
|
208
|
+
* Pure bounded CAS decision. Persist under the owning transaction and current
|
|
209
|
+
* credential/peer fence. New acceptance also requires the exact global incumbent;
|
|
210
|
+
* only a previously persisted exact body can replay after the incumbent changes.
|
|
211
|
+
* The helper cannot prove either condition. Retain both bodies after removal.
|
|
212
|
+
*/
|
|
213
|
+
export const evaluateRuntimeAssignmentTerminalReceiptV1 = async (valueArg, acceptedHistoryArg, assignmentHistoryArg) => {
|
|
214
|
+
try {
|
|
215
|
+
const receipt = snapshotRuntimeAssignmentTerminalReceiptV1(valueArg);
|
|
216
|
+
const accepted = snapshotRuntimeAssignmentTerminalReceiptHistoryV1(acceptedHistoryArg);
|
|
217
|
+
const history = assignments(assignmentHistoryArg);
|
|
218
|
+
await checkAssignmentHistory(history);
|
|
219
|
+
for (const existing of accepted)
|
|
220
|
+
await checkReceipt(existing, history, existing.sequence === 1 ? null : accepted[0]);
|
|
221
|
+
if (receipt.digest !== await computeSnapshotDigest(receipt)
|
|
222
|
+
|| history.length <= receipt.sequence
|
|
223
|
+
|| canonical(receipt.runAssignment) !== canonical(getRuntimeAssignmentV1Reference(history[0]))
|
|
224
|
+
|| canonical(receipt.assignment) !== canonical(getRuntimeAssignmentV1Reference(history[receipt.sequence]))) {
|
|
225
|
+
return { status: 'reject', reason: 'invalid' };
|
|
226
|
+
}
|
|
227
|
+
const existing = accepted[receipt.sequence - 1];
|
|
228
|
+
if (existing)
|
|
229
|
+
return canonical(existing) === canonical(receipt)
|
|
230
|
+
? { status: 'replay', receipt: existing } : { status: 'reject', reason: 'conflict' };
|
|
231
|
+
if (receipt.sequence !== accepted.length + 1)
|
|
232
|
+
return { status: 'reject', reason: 'sequence-gap' };
|
|
233
|
+
if (receipt.sequence === 2 && (receipt.previousReceiptDigest !== accepted[0].digest
|
|
234
|
+
|| receipt.operation.id === accepted[0].operation.id))
|
|
235
|
+
return { status: 'reject', reason: 'predecessor-mismatch' };
|
|
236
|
+
return { status: 'accept', receipt };
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
return { status: 'reject', reason: 'invalid' };
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
export const snapshotReportRuntimeAssignmentTerminalReceiptRequestV1 = (valueArg) => safe(() => {
|
|
243
|
+
const value = record(capture(valueArg), ['session', 'receipt']);
|
|
244
|
+
return { session: snapshotRuntimeSessionBindingV1(value.session), receipt: snapshotRuntimeAssignmentTerminalReceiptV1(value.receipt) };
|
|
245
|
+
});
|
|
246
|
+
export const snapshotReportRuntimeAssignmentTerminalReceiptResponseV1 = (valueArg) => safe(() => {
|
|
247
|
+
const value = record(capture(valueArg), ['receipt', 'authorityUse']);
|
|
248
|
+
requireValue(value.authorityUse === 'current-session' || value.authorityUse === 'historical-recovery');
|
|
249
|
+
return { receipt: snapshotRuntimeAssignmentTerminalReceiptV1(value.receipt), authorityUse: value.authorityUse };
|
|
250
|
+
});
|
|
251
|
+
/**
|
|
252
|
+
* CURRENT physical session and immutable server-indexed reporter history are
|
|
253
|
+
* trusted owner inputs, never wire claims. The previous stop receipt must also
|
|
254
|
+
* come from the durable owner. This binds content; it does not authenticate,
|
|
255
|
+
* prove the local operation join, advance CAS, or admit a replacement.
|
|
256
|
+
*/
|
|
257
|
+
export const bindReportRuntimeAssignmentTerminalReceiptRequestV1 = async (valueArg, assignmentHistoryArg, previousReceiptArg, trustedSessionArg, reporterHistoryArg) => {
|
|
258
|
+
try {
|
|
259
|
+
const request = snapshotReportRuntimeAssignmentTerminalReceiptRequestV1(valueArg);
|
|
260
|
+
const history = assignments(assignmentHistoryArg);
|
|
261
|
+
const previous = previousReceiptArg === null ? null : snapshotRuntimeAssignmentTerminalReceiptV1(previousReceiptArg);
|
|
262
|
+
requireValue(history.length > request.receipt.sequence);
|
|
263
|
+
const binding = bindRuntimeReporterSessionV1(request.session, request.receipt.reporterSessionId, history[request.receipt.sequence], trustedSessionArg, reporterHistoryArg);
|
|
264
|
+
await checkAssignmentHistory(history);
|
|
265
|
+
await checkReceipt(request.receipt, history, previous);
|
|
266
|
+
return { request, authorityUse: binding.authorityUse };
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
return fail();
|
|
270
|
+
}
|
|
271
|
+
};
|
|
272
|
+
/** Exact ACK of the immutable outbox body; no rewritten session, operation or chain. */
|
|
273
|
+
export const bindReportRuntimeAssignmentTerminalReceiptResponseV1 = (valueArg, requestArg) => safe(() => {
|
|
274
|
+
const response = snapshotReportRuntimeAssignmentTerminalReceiptResponseV1(valueArg);
|
|
275
|
+
const request = snapshotReportRuntimeAssignmentTerminalReceiptRequestV1(requestArg);
|
|
276
|
+
requireValue(canonical(response.receipt) === canonical(request.receipt)
|
|
277
|
+
&& response.authorityUse === (request.receipt.reporterSessionId === request.session.reporterSessionId
|
|
278
|
+
? 'current-session' : 'historical-recovery'));
|
|
279
|
+
return response;
|
|
280
|
+
});
|
|
281
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZXRlcm1pbmFscmVjZWlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2RhdGEvcnVudGltZXRlcm1pbmFscmVjZWlwdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFckQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLCtCQUErQixFQUNuRSwyQkFBMkIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTlELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3BHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBNERuRyxNQUFNLENBQUMsTUFBTSwwQ0FBMEMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3RFLFlBQVksRUFBRSxtREFBbUQ7SUFDakUsNEJBQTRCLEVBQUUsTUFBTTtJQUNwQyw0QkFBNEIsRUFBRSxNQUFNO0lBQ3BDLGVBQWUsRUFBRSxDQUFDO0lBQ2xCLDBCQUEwQixFQUFFLENBQUM7SUFDN0IsS0FBSyxFQUFFLDZDQUE2QztDQUM1QyxDQUFDLENBQUM7QUFFWixNQUFNLElBQUksR0FBRyxHQUFVLEVBQUUsR0FBRyxNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pHLFNBQVMsWUFBWSxDQUFDLFlBQXFCLElBQTBCLElBQUksQ0FBQyxZQUFZO0lBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2pHLE1BQU0sSUFBSSxHQUFHLENBQUksWUFBcUIsRUFBSyxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBQUMsT0FBTyxZQUFZLEVBQUUsQ0FBQztBQUFDLENBQUM7QUFBQyxNQUFNLENBQUM7SUFBQyxPQUFPLElBQUksRUFBRSxDQUFDO0FBQUMsQ0FBQyxDQUFDLENBQUMs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
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as plugins from '../plugins.js';
|
|
2
2
|
import type * as data from '../data/runtimesession.js';
|
|
3
|
+
import type * as terminal from '../data/runtimeterminalreceipt.js';
|
|
3
4
|
/** WSS-only Pallet bootstrap. Derive physical peer/process/idempotency server-side. */
|
|
4
5
|
export interface IReq_Pallet_Cloudly_RegisterPalletRuntimeSessionV1 extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Pallet_Cloudly_RegisterPalletRuntimeSessionV1> {
|
|
5
6
|
method: 'registerPalletRuntimeSessionV1';
|
|
@@ -18,6 +19,12 @@ export interface IReq_Pallet_Controller_ReportRuntimeAssignmentObservationV1 ext
|
|
|
18
19
|
request: data.IReportRuntimeAssignmentObservationRequestV1;
|
|
19
20
|
response: data.IReportRuntimeAssignmentObservationResponseV1;
|
|
20
21
|
}
|
|
22
|
+
/** Exact joined terminal-operation receipt; observations and boot changes cannot substitute. */
|
|
23
|
+
export interface IReq_Pallet_Controller_ReportRuntimeAssignmentTerminalReceiptV1 extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Pallet_Controller_ReportRuntimeAssignmentTerminalReceiptV1> {
|
|
24
|
+
method: 'reportRuntimeAssignmentTerminalReceiptV1';
|
|
25
|
+
request: terminal.IReportRuntimeAssignmentTerminalReceiptRequestV1;
|
|
26
|
+
response: terminal.IReportRuntimeAssignmentTerminalReceiptResponseV1;
|
|
27
|
+
}
|
|
21
28
|
/** Current-peer, exact current assignment authorization; response is secret material. */
|
|
22
29
|
export interface IReq_Pallet_Controller_GetRuntimeRegistryCredentialV1 extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Pallet_Controller_GetRuntimeRegistryCredentialV1> {
|
|
23
30
|
method: 'getRuntimeRegistryCredentialV1';
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -251,6 +251,41 @@ machine JWT on a physical TypedSocket so the server can own its identity tag.
|
|
|
251
251
|
Both registration methods reject HTTP transport. Sensitive requests and registry
|
|
252
252
|
responses must be excluded from hooks, logs, diagnostics and durable journals.
|
|
253
253
|
|
|
254
|
+
### Joined Runtime Terminal Receipts
|
|
255
|
+
|
|
256
|
+
`data.IRuntimeAssignmentTerminalReceiptV1` and
|
|
257
|
+
`requests.runtimesession.reportRuntimeAssignmentTerminalReceiptV1` carry a separate
|
|
258
|
+
receipt for the exact Pallet attempt's joined terminal execution. Sequence 1 binds
|
|
259
|
+
the generation 2 stop assignment; sequence 2 binds generation 3 removal and the
|
|
260
|
+
exact stop receipt digest. Both retain the original generation 1 run reference.
|
|
261
|
+
The full immutable assignment chain and both receipt bodies remain durable after
|
|
262
|
+
removal, permitting an exact earlier stop receipt to be acknowledged again.
|
|
263
|
+
|
|
264
|
+
Only a durably completed native operation can issue a terminal receipt. Native
|
|
265
|
+
stop joins container and sandbox stop; native remove requires an already stopped
|
|
266
|
+
sandbox and joins container and sandbox removal. The assignment owner separately
|
|
267
|
+
requires the exact completed stop before admitting removal. Terminal evidence
|
|
268
|
+
contains precise CRI identifiers, the kernel boot UUID, and stopped/absent state;
|
|
269
|
+
this native path does not collect IP addresses. Pending, unknown and host-fenced
|
|
270
|
+
journal entries never qualify. A proven boot change can permit a new joined
|
|
271
|
+
terminal operation but cannot skip the stop/remove chain.
|
|
272
|
+
|
|
273
|
+
The synchronous snapshot helpers validate bounded exact data only. Digest,
|
|
274
|
+
assignment-chain and receipt-chain helpers do not prove native execution or
|
|
275
|
+
authenticate a reporter. `bindRuntimeReporterSessionV1` and the terminal report
|
|
276
|
+
binder require the current physical session and immutable server-indexed reporter
|
|
277
|
+
history from their trusted owners. Reconnect recovery preserves every original
|
|
278
|
+
receipt field and returns `historical-recovery`; it never restores active
|
|
279
|
+
readiness, routes or liveness. The response binder rejects rewritten receipt bodies.
|
|
280
|
+
|
|
281
|
+
Cloudly must transact new acceptance against the exact global incumbent, stored
|
|
282
|
+
assignment chain and current peer, credential and node authority. A first receipt
|
|
283
|
+
after the incumbent changes is denied; only an already persisted exact receipt
|
|
284
|
+
can be acknowledged again under current authentication. These receipts settle
|
|
285
|
+
only the named Pallet attempt. They do not authorize storage relocation, prove
|
|
286
|
+
whole-host or Docker/Coreflow absence, grant another controller or organization
|
|
287
|
+
authority, or replace independently qualified readiness and routing evidence.
|
|
288
|
+
|
|
254
289
|
### Offline SmartDB Settlement And Packaging
|
|
255
290
|
|
|
256
291
|
The Node-only `@serve.zone/interfaces/runtime` export includes isolated V1
|
package/ts/00_commitinfo_data.ts
CHANGED
package/ts/data/index.ts
CHANGED
|
@@ -26,6 +26,7 @@ export * from './registry.js';
|
|
|
26
26
|
export * from './runtimeassignment.js';
|
|
27
27
|
export * from './runtimeconfig.js';
|
|
28
28
|
export * from './runtimesession.js';
|
|
29
|
+
export * from './runtimeterminalreceipt.js';
|
|
29
30
|
export * from './secret.js';
|
|
30
31
|
export * from './baremetal.js';
|
|
31
32
|
export * from './baseos.js';
|
|
@@ -61,6 +61,14 @@ export interface IReportRuntimeAssignmentObservationRequestV1 {
|
|
|
61
61
|
|
|
62
62
|
export type TRuntimeObservationAuthorityUseV1 = 'current-session' | 'historical-recovery';
|
|
63
63
|
|
|
64
|
+
/** Content comparison result only; all supplied authority must come from its trusted owner. */
|
|
65
|
+
export interface IRuntimeReporterSessionBindingV1 {
|
|
66
|
+
session: IRuntimeSessionBindingV1;
|
|
67
|
+
assignment: IRuntimeAssignmentV1;
|
|
68
|
+
reporterHistory: IRuntimeSessionBindingV1;
|
|
69
|
+
authorityUse: TRuntimeObservationAuthorityUseV1;
|
|
70
|
+
}
|
|
71
|
+
|
|
64
72
|
export interface IReportRuntimeAssignmentObservationResponseV1 {
|
|
65
73
|
/** Exact request body after a durable sequence/receipt transaction. */
|
|
66
74
|
observation: IRuntimeAssignmentObservationV1;
|
|
@@ -343,6 +351,32 @@ export const bindApplyRuntimeAssignmentResponseV1 = (
|
|
|
343
351
|
return response;
|
|
344
352
|
});
|
|
345
353
|
|
|
354
|
+
/**
|
|
355
|
+
* Synchronous detached content binding, not authentication. trustedSessionArg must
|
|
356
|
+
* be the CURRENT authenticated physical peer; reporterHistoryArg must be immutable
|
|
357
|
+
* server-indexed Pallet-purpose history. Never obtain either from request fields.
|
|
358
|
+
* The owning transaction must recheck current credential/peer authority. Assignment
|
|
359
|
+
* digest validation and report-specific authority remain the caller's responsibility.
|
|
360
|
+
*/
|
|
361
|
+
export const bindRuntimeReporterSessionV1 = (
|
|
362
|
+
sessionArg: unknown, reporterSessionIdArg: string, assignmentArg: unknown,
|
|
363
|
+
trustedSessionArg: unknown, reporterHistoryArg: unknown,
|
|
364
|
+
): IRuntimeReporterSessionBindingV1 => safe(() => {
|
|
365
|
+
const incomingSession = snapshotRuntimeSessionBindingV1(sessionArg);
|
|
366
|
+
const reporterSessionId = identifier(reporterSessionIdArg);
|
|
367
|
+
const assignment = snapshotRuntimeAssignmentV1(capture(assignmentArg));
|
|
368
|
+
const trustedSession = snapshotRuntimeSessionBindingV1(trustedSessionArg);
|
|
369
|
+
const reporterHistory = snapshotRuntimeSessionBindingV1(reporterHistoryArg);
|
|
370
|
+
requireValue(sameSession(incomingSession, trustedSession) && matchesAssignment(trustedSession, assignment)
|
|
371
|
+
&& reporterSessionId === reporterHistory.reporterSessionId && sameOwner(trustedSession, reporterHistory));
|
|
372
|
+
const current = sameSession(reporterHistory, trustedSession);
|
|
373
|
+
requireValue(current || (reporterHistory.reporterSessionId !== trustedSession.reporterSessionId
|
|
374
|
+
&& reporterHistory.sessionEpoch < trustedSession.sessionEpoch
|
|
375
|
+
&& reporterHistory.credentialGeneration <= trustedSession.credentialGeneration));
|
|
376
|
+
return { session: incomingSession, assignment, reporterHistory,
|
|
377
|
+
authorityUse: current ? 'current-session' : 'historical-recovery' };
|
|
378
|
+
});
|
|
379
|
+
|
|
346
380
|
/**
|
|
347
381
|
* trustedSessionArg is the CURRENT authenticated physical peer. reporterHistoryArg
|
|
348
382
|
* must be server-indexed immutable session history, obtained by the original
|
|
@@ -359,18 +393,10 @@ export const bindReportRuntimeAssignmentObservationRequestV1 = async (
|
|
|
359
393
|
): Promise<{ request: IReportRuntimeAssignmentObservationRequestV1; authorityUse: TRuntimeObservationAuthorityUseV1 }> => {
|
|
360
394
|
try {
|
|
361
395
|
const request = snapshotReportRuntimeAssignmentObservationRequestV1(valueArg);
|
|
362
|
-
const
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
&& request.observation.reporterSessionId === reporterHistory.reporterSessionId
|
|
367
|
-
&& sameOwner(trustedSession, reporterHistory));
|
|
368
|
-
const current = sameSession(reporterHistory, trustedSession);
|
|
369
|
-
requireValue(current || (reporterHistory.reporterSessionId !== trustedSession.reporterSessionId
|
|
370
|
-
&& reporterHistory.sessionEpoch < trustedSession.sessionEpoch
|
|
371
|
-
&& reporterHistory.credentialGeneration <= trustedSession.credentialGeneration));
|
|
372
|
-
requireValue((await validateRuntimeAssignmentObservationV1(request.observation, assignment)).length === 0);
|
|
373
|
-
return { request, authorityUse: current ? 'current-session' : 'historical-recovery' };
|
|
396
|
+
const binding = bindRuntimeReporterSessionV1(request.session, request.observation.reporterSessionId,
|
|
397
|
+
assignmentArg, trustedSessionArg, reporterHistoryArg);
|
|
398
|
+
requireValue((await validateRuntimeAssignmentObservationV1(request.observation, binding.assignment)).length === 0);
|
|
399
|
+
return { request, authorityUse: binding.authorityUse };
|
|
374
400
|
} catch { return fail(); }
|
|
375
401
|
};
|
|
376
402
|
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
import type { TSha256Digest } from './immutableimage.js';
|
|
2
|
+
import { isSha256Digest } from './immutableimage.js';
|
|
3
|
+
import type { IRuntimeAssignmentReferenceV1, IRuntimeAssignmentV1 } from './runtimeassignment.js';
|
|
4
|
+
import { evaluateRuntimeAssignmentV1, getRuntimeAssignmentV1Reference,
|
|
5
|
+
snapshotRuntimeAssignmentV1 } from './runtimeassignment.js';
|
|
6
|
+
import type { IRuntimeSessionBindingV1, TRuntimeObservationAuthorityUseV1 } from './runtimesession.js';
|
|
7
|
+
import { bindRuntimeReporterSessionV1, snapshotRuntimeSessionBindingV1 } from './runtimesession.js';
|
|
8
|
+
import { canonicalizeStrictJson, createCanonicalJsonSha256Hex } from '../private/canonicaljson.js';
|
|
9
|
+
|
|
10
|
+
/** Exact value-free native terminal evidence; terminal inspection does not collect addresses. */
|
|
11
|
+
export interface IRuntimeAssignmentTerminalEvidenceV1 {
|
|
12
|
+
phase: 'stopped' | 'absent';
|
|
13
|
+
sandboxId: string | null;
|
|
14
|
+
containerId: string | null;
|
|
15
|
+
imageConfigDigest: TSha256Digest | null;
|
|
16
|
+
/** Exactly empty for the qualified native stop/remove path; no route evidence. */
|
|
17
|
+
ipAddresses: string[];
|
|
18
|
+
exitCode: number | null;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Qualified only when the named Pallet owner has durably joined this exact native
|
|
23
|
+
* operation. Structure and digest alone do not prove that join. Pending, unknown
|
|
24
|
+
* and host-fenced journal entries can never issue this receipt. A new boot permits
|
|
25
|
+
* a new joined terminal operation; it cannot replace the stop/remove chain.
|
|
26
|
+
*
|
|
27
|
+
* This settles only the named Pallet attempt. It grants no readiness, routing,
|
|
28
|
+
* liveness, storage relocation, whole-host, Docker/Coreflow absence, other
|
|
29
|
+
* controller or cross-organization authority. It has no authoritative wall clock.
|
|
30
|
+
*/
|
|
31
|
+
export interface IRuntimeAssignmentTerminalReceiptV1 {
|
|
32
|
+
schemaVersion: 1;
|
|
33
|
+
/** Exact generation 2 stop or generation 3 remove revision. */
|
|
34
|
+
assignment: IRuntimeAssignmentReferenceV1;
|
|
35
|
+
/** Exact immutable generation 1 run revision. */
|
|
36
|
+
runAssignment: IRuntimeAssignmentReferenceV1;
|
|
37
|
+
reporterSessionId: string;
|
|
38
|
+
sequence: 1 | 2;
|
|
39
|
+
operation: {
|
|
40
|
+
id: string;
|
|
41
|
+
action: 'stop' | 'remove';
|
|
42
|
+
bootId: string;
|
|
43
|
+
status: 'completed';
|
|
44
|
+
evidence: IRuntimeAssignmentTerminalEvidenceV1;
|
|
45
|
+
};
|
|
46
|
+
/** Null for stop; the exact accepted stop receipt digest for remove. */
|
|
47
|
+
previousReceiptDigest: TSha256Digest | null;
|
|
48
|
+
digest: TSha256Digest;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface IReportRuntimeAssignmentTerminalReceiptRequestV1 {
|
|
52
|
+
/** Current physical peer binding, even when the immutable receipt is historical. */
|
|
53
|
+
session: IRuntimeSessionBindingV1;
|
|
54
|
+
receipt: IRuntimeAssignmentTerminalReceiptV1;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface IReportRuntimeAssignmentTerminalReceiptResponseV1 {
|
|
58
|
+
/** Exact immutable body after the owning durable receipt transaction. */
|
|
59
|
+
receipt: IRuntimeAssignmentTerminalReceiptV1;
|
|
60
|
+
/** Historical recovery never restores active readiness, routes or liveness. */
|
|
61
|
+
authorityUse: TRuntimeObservationAuthorityUseV1;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export type TRuntimeAssignmentTerminalReceiptDecisionV1 =
|
|
65
|
+
| { status: 'accept' | 'replay'; receipt: IRuntimeAssignmentTerminalReceiptV1 }
|
|
66
|
+
| { status: 'reject'; reason: 'invalid' | 'conflict' | 'sequence-gap' | 'predecessor-mismatch' };
|
|
67
|
+
|
|
68
|
+
export const runtimeAssignmentTerminalReceiptV1Contract = Object.freeze({
|
|
69
|
+
digestDomain: 'serve.zone/runtime-assignment-terminal-receipt-v1',
|
|
70
|
+
maximumReceiptCanonicalBytes: 16_384,
|
|
71
|
+
maximumHistoryCanonicalBytes: 98_304,
|
|
72
|
+
maximumReceipts: 2,
|
|
73
|
+
maximumAssignmentRevisions: 3,
|
|
74
|
+
error: 'Runtime terminal receipt contract rejected.',
|
|
75
|
+
} as const);
|
|
76
|
+
|
|
77
|
+
const fail = (): never => { throw new Error(runtimeAssignmentTerminalReceiptV1Contract.error); };
|
|
78
|
+
function requireValue(conditionArg: unknown): asserts conditionArg { if (!conditionArg) fail(); }
|
|
79
|
+
const safe = <T>(operationArg: () => T): T => { try { return operationArg(); } catch { return fail(); } };
|
|
80
|
+
const canonical = (valueArg: unknown): string => canonicalizeStrictJson(valueArg, fail);
|
|
81
|
+
const encoder = new TextEncoder();
|
|
82
|
+
const identifier = (valueArg: unknown): string => {
|
|
83
|
+
requireValue(typeof valueArg === 'string' && /^[A-Za-z0-9][A-Za-z0-9:._-]{0,199}$/.test(valueArg));
|
|
84
|
+
return valueArg;
|
|
85
|
+
};
|
|
86
|
+
const digest = (valueArg: unknown): TSha256Digest => {
|
|
87
|
+
requireValue(typeof valueArg === 'string' && isSha256Digest(valueArg));
|
|
88
|
+
return valueArg;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
/** Bounded inert copy before hashing or calling any nested validator. */
|
|
92
|
+
const capture = (valueArg: unknown, maximumBytesArg: number = runtimeAssignmentTerminalReceiptV1Contract.maximumHistoryCanonicalBytes): unknown => safe(() => {
|
|
93
|
+
let nodes = 0;
|
|
94
|
+
let bytes = 0;
|
|
95
|
+
const ancestors = new Set<object>();
|
|
96
|
+
const account = (value: string): void => {
|
|
97
|
+
requireValue(value.length <= maximumBytesArg);
|
|
98
|
+
bytes += encoder.encode(value).byteLength;
|
|
99
|
+
requireValue(bytes <= maximumBytesArg);
|
|
100
|
+
};
|
|
101
|
+
const copy = (value: unknown, depth: number): unknown => {
|
|
102
|
+
requireValue(++nodes <= 4096 && depth <= 12);
|
|
103
|
+
if (typeof value === 'string') { account(value); return value; }
|
|
104
|
+
if (value === null || typeof value === 'boolean' || typeof value === 'number') return value;
|
|
105
|
+
requireValue(value !== null && typeof value === 'object' && !ancestors.has(value));
|
|
106
|
+
const array = Array.isArray(value);
|
|
107
|
+
const prototype = Object.getPrototypeOf(value);
|
|
108
|
+
requireValue(array ? prototype === Array.prototype : prototype === Object.prototype || prototype === null);
|
|
109
|
+
ancestors.add(value);
|
|
110
|
+
try {
|
|
111
|
+
const keys = Reflect.ownKeys(value);
|
|
112
|
+
requireValue(keys.length <= 65);
|
|
113
|
+
if (array) {
|
|
114
|
+
const length = Object.getOwnPropertyDescriptor(value, 'length')?.value;
|
|
115
|
+
requireValue(Number.isSafeInteger(length) && length >= 0 && length <= 64 && keys.length === length + 1);
|
|
116
|
+
const result: unknown[] = [];
|
|
117
|
+
for (let index = 0; index < length; index++) {
|
|
118
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
|
|
119
|
+
requireValue(descriptor?.enumerable && Object.hasOwn(descriptor, 'value'));
|
|
120
|
+
result.push(copy(descriptor.value, depth + 1));
|
|
121
|
+
}
|
|
122
|
+
return result;
|
|
123
|
+
}
|
|
124
|
+
const result: Record<string, unknown> = Object.create(null);
|
|
125
|
+
for (const key of keys) {
|
|
126
|
+
requireValue(typeof key === 'string'); account(key);
|
|
127
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
128
|
+
requireValue(descriptor?.enumerable && Object.hasOwn(descriptor, 'value'));
|
|
129
|
+
result[key] = copy(descriptor.value, depth + 1);
|
|
130
|
+
}
|
|
131
|
+
return result;
|
|
132
|
+
} finally { ancestors.delete(value); }
|
|
133
|
+
};
|
|
134
|
+
const serialized = canonical(copy(valueArg, 0));
|
|
135
|
+
requireValue(encoder.encode(serialized).byteLength <= maximumBytesArg);
|
|
136
|
+
return JSON.parse(serialized);
|
|
137
|
+
});
|
|
138
|
+
const record = (valueArg: unknown, keysArg: string[]): Record<string, unknown> => {
|
|
139
|
+
requireValue(valueArg !== null && typeof valueArg === 'object' && !Array.isArray(valueArg));
|
|
140
|
+
const keys = Object.keys(valueArg);
|
|
141
|
+
requireValue(keys.length === keysArg.length && keys.every((key) => keysArg.includes(key)));
|
|
142
|
+
return valueArg as Record<string, unknown>;
|
|
143
|
+
};
|
|
144
|
+
const reference = (valueArg: unknown): IRuntimeAssignmentReferenceV1 => {
|
|
145
|
+
const value = record(valueArg, ['assignmentId', 'generation', 'digest']);
|
|
146
|
+
requireValue(typeof value.generation === 'number' && Number.isSafeInteger(value.generation)
|
|
147
|
+
&& value.generation >= 1 && value.generation <= 3);
|
|
148
|
+
return { assignmentId: identifier(value.assignmentId), generation: value.generation, digest: digest(value.digest) };
|
|
149
|
+
};
|
|
150
|
+
const evidence = (valueArg: unknown): IRuntimeAssignmentTerminalEvidenceV1 => {
|
|
151
|
+
const value = record(valueArg, ['phase', 'sandboxId', 'containerId', 'imageConfigDigest', 'ipAddresses', 'exitCode']);
|
|
152
|
+
requireValue(value.phase === 'absent' || value.phase === 'stopped');
|
|
153
|
+
for (const field of ['sandboxId', 'containerId']) requireValue(value[field] === null
|
|
154
|
+
|| (typeof value[field] === 'string' && /^[a-f0-9]{64}$/.test(value[field])));
|
|
155
|
+
requireValue(value.imageConfigDigest === null || (typeof value.imageConfigDigest === 'string'
|
|
156
|
+
&& isSha256Digest(value.imageConfigDigest)));
|
|
157
|
+
requireValue(Array.isArray(value.ipAddresses) && value.ipAddresses.length === 0);
|
|
158
|
+
requireValue(value.exitCode === null || (typeof value.exitCode === 'number' && Number.isSafeInteger(value.exitCode)
|
|
159
|
+
&& value.exitCode >= -2_147_483_648 && value.exitCode <= 2_147_483_647));
|
|
160
|
+
requireValue(value.phase === 'absent'
|
|
161
|
+
? value.sandboxId === null && value.containerId === null && value.imageConfigDigest === null && value.exitCode === null
|
|
162
|
+
: value.sandboxId !== null);
|
|
163
|
+
requireValue(value.containerId !== null || (value.imageConfigDigest === null && value.exitCode === null));
|
|
164
|
+
return value as unknown as IRuntimeAssignmentTerminalEvidenceV1;
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
/** Detached exact-schema assertion only; digest, journal provenance and authority remain unverified. */
|
|
168
|
+
export const snapshotRuntimeAssignmentTerminalReceiptV1 = (valueArg: unknown): IRuntimeAssignmentTerminalReceiptV1 => safe(() => {
|
|
169
|
+
const value = record(capture(valueArg, runtimeAssignmentTerminalReceiptV1Contract.maximumReceiptCanonicalBytes),
|
|
170
|
+
['schemaVersion', 'assignment', 'runAssignment', 'reporterSessionId', 'sequence', 'operation', 'previousReceiptDigest', 'digest']);
|
|
171
|
+
const assignment = reference(value.assignment);
|
|
172
|
+
const runAssignment = reference(value.runAssignment);
|
|
173
|
+
const operation = record(value.operation, ['id', 'action', 'bootId', 'status', 'evidence']);
|
|
174
|
+
const terminalEvidence = evidence(operation.evidence);
|
|
175
|
+
requireValue(value.schemaVersion === 1 && (value.sequence === 1 || value.sequence === 2)
|
|
176
|
+
&& operation.status === 'completed' && assignment.generation === value.sequence + 1
|
|
177
|
+
&& runAssignment.generation === 1 && runAssignment.assignmentId === assignment.assignmentId);
|
|
178
|
+
requireValue(typeof operation.bootId === 'string'
|
|
179
|
+
&& /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/.test(operation.bootId));
|
|
180
|
+
requireValue(value.sequence === 1 ? operation.action === 'stop' && value.previousReceiptDigest === null
|
|
181
|
+
: operation.action === 'remove' && terminalEvidence.phase === 'absent' && value.previousReceiptDigest !== null);
|
|
182
|
+
return { schemaVersion: 1, assignment, runAssignment, reporterSessionId: identifier(value.reporterSessionId),
|
|
183
|
+
sequence: value.sequence, operation: { id: identifier(operation.id), action: operation.action as 'stop' | 'remove',
|
|
184
|
+
bootId: operation.bootId, status: 'completed', evidence: terminalEvidence },
|
|
185
|
+
previousReceiptDigest: value.previousReceiptDigest === null ? null : digest(value.previousReceiptDigest), digest: digest(value.digest) };
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
/** Bounded exact receipt history for synchronous persistence assertions; hashes remain unchecked. */
|
|
189
|
+
export const snapshotRuntimeAssignmentTerminalReceiptHistoryV1 = (valueArg: unknown): IRuntimeAssignmentTerminalReceiptV1[] => safe(() => {
|
|
190
|
+
const values = capture(valueArg);
|
|
191
|
+
requireValue(Array.isArray(values) && values.length <= runtimeAssignmentTerminalReceiptV1Contract.maximumReceipts);
|
|
192
|
+
const receipts = values.map(snapshotRuntimeAssignmentTerminalReceiptV1);
|
|
193
|
+
for (const [index, receipt] of receipts.entries()) {
|
|
194
|
+
requireValue(receipt.sequence === index + 1);
|
|
195
|
+
if (index > 0) requireValue(receipt.previousReceiptDigest === receipts[0].digest
|
|
196
|
+
&& canonical(receipt.runAssignment) === canonical(receipts[0].runAssignment)
|
|
197
|
+
&& receipt.operation.id !== receipts[0].operation.id);
|
|
198
|
+
}
|
|
199
|
+
return receipts;
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
const assignments = (valueArg: unknown): IRuntimeAssignmentV1[] => {
|
|
203
|
+
const values = capture(valueArg);
|
|
204
|
+
requireValue(Array.isArray(values) && values.length >= 2
|
|
205
|
+
&& values.length <= runtimeAssignmentTerminalReceiptV1Contract.maximumAssignmentRevisions);
|
|
206
|
+
return values.map(snapshotRuntimeAssignmentV1);
|
|
207
|
+
};
|
|
208
|
+
const checkAssignmentHistory = async (historyArg: IRuntimeAssignmentV1[]): Promise<void> => {
|
|
209
|
+
const run = historyArg[0];
|
|
210
|
+
const scope = { controller: run.controller, organizationId: run.organizationId,
|
|
211
|
+
nodeId: run.nodeId, runtimeNamespace: run.runtimeNamespace };
|
|
212
|
+
for (const [index, assignment] of historyArg.entries()) {
|
|
213
|
+
requireValue(assignment.generation === index + 1
|
|
214
|
+
&& assignment.disposition === ['run', 'stop-preserve', 'remove-runtime-preserve-storage'][index]);
|
|
215
|
+
requireValue((await evaluateRuntimeAssignmentV1(assignment, index === 0 ? null : historyArg[index - 1], scope)).status === 'accept');
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
const computeSnapshotDigest = async (receiptArg: IRuntimeAssignmentTerminalReceiptV1): Promise<TSha256Digest> => {
|
|
219
|
+
const { digest: _digest, ...payload } = receiptArg;
|
|
220
|
+
return `sha256:${await createCanonicalJsonSha256Hex(canonical({
|
|
221
|
+
domain: runtimeAssignmentTerminalReceiptV1Contract.digestDomain, payload,
|
|
222
|
+
}), fail)}`;
|
|
223
|
+
};
|
|
224
|
+
/** Domain-separated exact body digest; captures before asynchronous hashing. */
|
|
225
|
+
export const computeRuntimeAssignmentTerminalReceiptV1Digest = async (
|
|
226
|
+
valueArg: IRuntimeAssignmentTerminalReceiptV1,
|
|
227
|
+
): Promise<TSha256Digest> => {
|
|
228
|
+
try { return await computeSnapshotDigest(snapshotRuntimeAssignmentTerminalReceiptV1(valueArg)); } catch { return fail(); }
|
|
229
|
+
};
|
|
230
|
+
const checkReceipt = async (
|
|
231
|
+
receiptArg: IRuntimeAssignmentTerminalReceiptV1, historyArg: IRuntimeAssignmentV1[],
|
|
232
|
+
previousArg: IRuntimeAssignmentTerminalReceiptV1 | null,
|
|
233
|
+
): Promise<void> => {
|
|
234
|
+
requireValue(historyArg.length > receiptArg.sequence
|
|
235
|
+
&& canonical(receiptArg.runAssignment) === canonical(getRuntimeAssignmentV1Reference(historyArg[0]))
|
|
236
|
+
&& canonical(receiptArg.assignment) === canonical(getRuntimeAssignmentV1Reference(historyArg[receiptArg.sequence]))
|
|
237
|
+
&& receiptArg.digest === await computeSnapshotDigest(receiptArg));
|
|
238
|
+
if (receiptArg.sequence === 1) requireValue(previousArg === null);
|
|
239
|
+
else {
|
|
240
|
+
requireValue(previousArg !== null && previousArg.sequence === 1);
|
|
241
|
+
await checkReceipt(previousArg, historyArg, null);
|
|
242
|
+
requireValue(receiptArg.previousReceiptDigest === previousArg.digest && receiptArg.operation.id !== previousArg.operation.id);
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
/** Full immutable run/stop/remove chain and exact prior stop receipt are mandatory for removal. */
|
|
247
|
+
export const validateRuntimeAssignmentTerminalReceiptV1 = async (
|
|
248
|
+
valueArg: unknown, assignmentHistoryArg: unknown, previousReceiptArg: unknown,
|
|
249
|
+
): Promise<string[]> => {
|
|
250
|
+
try {
|
|
251
|
+
const receipt = snapshotRuntimeAssignmentTerminalReceiptV1(valueArg);
|
|
252
|
+
const history = assignments(assignmentHistoryArg);
|
|
253
|
+
const previous = previousReceiptArg === null ? null : snapshotRuntimeAssignmentTerminalReceiptV1(previousReceiptArg);
|
|
254
|
+
await checkAssignmentHistory(history);
|
|
255
|
+
await checkReceipt(receipt, history, previous);
|
|
256
|
+
return [];
|
|
257
|
+
} catch { return [runtimeAssignmentTerminalReceiptV1Contract.error]; }
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Pure bounded CAS decision. Persist under the owning transaction and current
|
|
262
|
+
* credential/peer fence. New acceptance also requires the exact global incumbent;
|
|
263
|
+
* only a previously persisted exact body can replay after the incumbent changes.
|
|
264
|
+
* The helper cannot prove either condition. Retain both bodies after removal.
|
|
265
|
+
*/
|
|
266
|
+
export const evaluateRuntimeAssignmentTerminalReceiptV1 = async (
|
|
267
|
+
valueArg: unknown, acceptedHistoryArg: unknown, assignmentHistoryArg: unknown,
|
|
268
|
+
): Promise<TRuntimeAssignmentTerminalReceiptDecisionV1> => {
|
|
269
|
+
try {
|
|
270
|
+
const receipt = snapshotRuntimeAssignmentTerminalReceiptV1(valueArg);
|
|
271
|
+
const accepted = snapshotRuntimeAssignmentTerminalReceiptHistoryV1(acceptedHistoryArg);
|
|
272
|
+
const history = assignments(assignmentHistoryArg);
|
|
273
|
+
await checkAssignmentHistory(history);
|
|
274
|
+
for (const existing of accepted) await checkReceipt(existing, history, existing.sequence === 1 ? null : accepted[0]);
|
|
275
|
+
if (receipt.digest !== await computeSnapshotDigest(receipt)
|
|
276
|
+
|| history.length <= receipt.sequence
|
|
277
|
+
|| canonical(receipt.runAssignment) !== canonical(getRuntimeAssignmentV1Reference(history[0]))
|
|
278
|
+
|| canonical(receipt.assignment) !== canonical(getRuntimeAssignmentV1Reference(history[receipt.sequence]))) {
|
|
279
|
+
return { status: 'reject', reason: 'invalid' };
|
|
280
|
+
}
|
|
281
|
+
const existing = accepted[receipt.sequence - 1];
|
|
282
|
+
if (existing) return canonical(existing) === canonical(receipt)
|
|
283
|
+
? { status: 'replay', receipt: existing } : { status: 'reject', reason: 'conflict' };
|
|
284
|
+
if (receipt.sequence !== accepted.length + 1) return { status: 'reject', reason: 'sequence-gap' };
|
|
285
|
+
if (receipt.sequence === 2 && (receipt.previousReceiptDigest !== accepted[0].digest
|
|
286
|
+
|| receipt.operation.id === accepted[0].operation.id)) return { status: 'reject', reason: 'predecessor-mismatch' };
|
|
287
|
+
return { status: 'accept', receipt };
|
|
288
|
+
} catch { return { status: 'reject', reason: 'invalid' }; }
|
|
289
|
+
};
|
|
290
|
+
|
|
291
|
+
export const snapshotReportRuntimeAssignmentTerminalReceiptRequestV1 = (
|
|
292
|
+
valueArg: unknown,
|
|
293
|
+
): IReportRuntimeAssignmentTerminalReceiptRequestV1 => safe(() => {
|
|
294
|
+
const value = record(capture(valueArg), ['session', 'receipt']);
|
|
295
|
+
return { session: snapshotRuntimeSessionBindingV1(value.session), receipt: snapshotRuntimeAssignmentTerminalReceiptV1(value.receipt) };
|
|
296
|
+
});
|
|
297
|
+
export const snapshotReportRuntimeAssignmentTerminalReceiptResponseV1 = (
|
|
298
|
+
valueArg: unknown,
|
|
299
|
+
): IReportRuntimeAssignmentTerminalReceiptResponseV1 => safe(() => {
|
|
300
|
+
const value = record(capture(valueArg), ['receipt', 'authorityUse']);
|
|
301
|
+
requireValue(value.authorityUse === 'current-session' || value.authorityUse === 'historical-recovery');
|
|
302
|
+
return { receipt: snapshotRuntimeAssignmentTerminalReceiptV1(value.receipt), authorityUse: value.authorityUse };
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* CURRENT physical session and immutable server-indexed reporter history are
|
|
307
|
+
* trusted owner inputs, never wire claims. The previous stop receipt must also
|
|
308
|
+
* come from the durable owner. This binds content; it does not authenticate,
|
|
309
|
+
* prove the local operation join, advance CAS, or admit a replacement.
|
|
310
|
+
*/
|
|
311
|
+
export const bindReportRuntimeAssignmentTerminalReceiptRequestV1 = async (
|
|
312
|
+
valueArg: unknown, assignmentHistoryArg: unknown, previousReceiptArg: unknown,
|
|
313
|
+
trustedSessionArg: unknown, reporterHistoryArg: unknown,
|
|
314
|
+
): Promise<{ request: IReportRuntimeAssignmentTerminalReceiptRequestV1; authorityUse: TRuntimeObservationAuthorityUseV1 }> => {
|
|
315
|
+
try {
|
|
316
|
+
const request = snapshotReportRuntimeAssignmentTerminalReceiptRequestV1(valueArg);
|
|
317
|
+
const history = assignments(assignmentHistoryArg);
|
|
318
|
+
const previous = previousReceiptArg === null ? null : snapshotRuntimeAssignmentTerminalReceiptV1(previousReceiptArg);
|
|
319
|
+
requireValue(history.length > request.receipt.sequence);
|
|
320
|
+
const binding = bindRuntimeReporterSessionV1(request.session, request.receipt.reporterSessionId,
|
|
321
|
+
history[request.receipt.sequence], trustedSessionArg, reporterHistoryArg);
|
|
322
|
+
await checkAssignmentHistory(history);
|
|
323
|
+
await checkReceipt(request.receipt, history, previous);
|
|
324
|
+
return { request, authorityUse: binding.authorityUse };
|
|
325
|
+
} catch { return fail(); }
|
|
326
|
+
};
|
|
327
|
+
|
|
328
|
+
/** Exact ACK of the immutable outbox body; no rewritten session, operation or chain. */
|
|
329
|
+
export const bindReportRuntimeAssignmentTerminalReceiptResponseV1 = (
|
|
330
|
+
valueArg: unknown, requestArg: unknown,
|
|
331
|
+
): IReportRuntimeAssignmentTerminalReceiptResponseV1 => safe(() => {
|
|
332
|
+
const response = snapshotReportRuntimeAssignmentTerminalReceiptResponseV1(valueArg);
|
|
333
|
+
const request = snapshotReportRuntimeAssignmentTerminalReceiptRequestV1(requestArg);
|
|
334
|
+
requireValue(canonical(response.receipt) === canonical(request.receipt)
|
|
335
|
+
&& response.authorityUse === (request.receipt.reporterSessionId === request.session.reporterSessionId
|
|
336
|
+
? 'current-session' : 'historical-recovery'));
|
|
337
|
+
return response;
|
|
338
|
+
});
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as plugins from '../plugins.js';
|
|
2
2
|
import type * as data from '../data/runtimesession.js';
|
|
3
|
+
import type * as terminal from '../data/runtimeterminalreceipt.js';
|
|
3
4
|
|
|
4
5
|
/** WSS-only Pallet bootstrap. Derive physical peer/process/idempotency server-side. */
|
|
5
6
|
export interface IReq_Pallet_Cloudly_RegisterPalletRuntimeSessionV1 extends plugins.typedrequestInterfaces.implementsTR<
|
|
@@ -31,6 +32,16 @@ export interface IReq_Pallet_Controller_ReportRuntimeAssignmentObservationV1 ext
|
|
|
31
32
|
response: data.IReportRuntimeAssignmentObservationResponseV1;
|
|
32
33
|
}
|
|
33
34
|
|
|
35
|
+
/** Exact joined terminal-operation receipt; observations and boot changes cannot substitute. */
|
|
36
|
+
export interface IReq_Pallet_Controller_ReportRuntimeAssignmentTerminalReceiptV1 extends plugins.typedrequestInterfaces.implementsTR<
|
|
37
|
+
plugins.typedrequestInterfaces.ITypedRequest,
|
|
38
|
+
IReq_Pallet_Controller_ReportRuntimeAssignmentTerminalReceiptV1
|
|
39
|
+
> {
|
|
40
|
+
method: 'reportRuntimeAssignmentTerminalReceiptV1';
|
|
41
|
+
request: terminal.IReportRuntimeAssignmentTerminalReceiptRequestV1;
|
|
42
|
+
response: terminal.IReportRuntimeAssignmentTerminalReceiptResponseV1;
|
|
43
|
+
}
|
|
44
|
+
|
|
34
45
|
/** Current-peer, exact current assignment authorization; response is secret material. */
|
|
35
46
|
export interface IReq_Pallet_Controller_GetRuntimeRegistryCredentialV1 extends plugins.typedrequestInterfaces.implementsTR<
|
|
36
47
|
plugins.typedrequestInterfaces.ITypedRequest,
|