@serve.zone/interfaces 30.8.1 → 30.9.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 CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026-09-13 - 30.9.0
4
+
5
+ ### Features
6
+
7
+ - Add durable native protection receipts, authenticated report bindings and complete affected-worker protection prerequisites for network allocation.
8
+
3
9
  ## 2026-09-13 - 30.8.1
4
10
 
5
11
  ### Fixes
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/interfaces',
6
- version: '30.8.1',
6
+ version: '30.9.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=
@@ -25,6 +25,7 @@ export * from './nodeenrollment.js';
25
25
  export * from './networkauthority.js';
26
26
  export * from './networkdelivery.js';
27
27
  export * from './networkprojection.js';
28
+ export * from './networkprotection.js';
28
29
  export * from './networksigning.js';
29
30
  export * from './privatenetwork.js';
30
31
  export * from './registry.js';
@@ -25,6 +25,7 @@ export * from './nodeenrollment.js';
25
25
  export * from './networkauthority.js';
26
26
  export * from './networkdelivery.js';
27
27
  export * from './networkprojection.js';
28
+ export * from './networkprotection.js';
28
29
  export * from './networksigning.js';
29
30
  export * from './privatenetwork.js';
30
31
  export * from './registry.js';
@@ -48,4 +49,4 @@ export * from './traffic.js';
48
49
  export * from './user.js';
49
50
  export * from './version.js';
50
51
  export * from './webpush.js';
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLFdBQVcsQ0FBQztBQUMxQixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGNBQWMsQ0FBQyJ9
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsY0FBYyxDQUFDIn0=
@@ -0,0 +1,68 @@
1
+ import type { TSha256Digest } from './immutableimage.js';
2
+ import type { IRuntimeAuthorityReferenceV1 } from './runtimeassignment.js';
3
+ import type { IRuntimeNetworkNodeScopeV1 } from './networkprojection.js';
4
+ import type { IRuntimeNetworkProtectedAuthorityV1 } from './networkauthority.js';
5
+ import type { IRuntimeSessionBindingV1 } from './runtimesession.js';
6
+ /**
7
+ * Durable native protection report, independent of projection admission and DNS.
8
+ * The producer owns a joined native journal covering ALL affected local egress
9
+ * paths. nativeBarrier identifies that complete journal, never an admission ACK,
10
+ * a single table inspection, a boot event or a caller-selected success flag.
11
+ * A null nativeBarrier explicitly withdraws this node's allocation eligibility.
12
+ */
13
+ export interface IRuntimeNetworkProtectionReceiptV1 extends IRuntimeNetworkNodeScopeV1 {
14
+ schemaVersion: 1;
15
+ id: string;
16
+ generation: number;
17
+ previous: IRuntimeAuthorityReferenceV1 | null;
18
+ protectedAuthority: IRuntimeAuthorityReferenceV1;
19
+ reporterSessionId: string;
20
+ bootId: string;
21
+ nativeBarrier: IRuntimeAuthorityReferenceV1 | null;
22
+ digest: TSha256Digest;
23
+ }
24
+ export interface IReportRuntimeNetworkProtectionRequestV1 {
25
+ session: IRuntimeSessionBindingV1;
26
+ receipt: IRuntimeNetworkProtectionReceiptV1;
27
+ }
28
+ export interface IReportRuntimeNetworkProtectionResponseV1 {
29
+ status: 'accepted' | 'replay';
30
+ receipt: IRuntimeAuthorityReferenceV1;
31
+ authorityUse: 'current' | 'historical';
32
+ }
33
+ export declare const runtimeNetworkProtectionV1Contract: Readonly<{
34
+ readonly digestDomain: "serve.zone/runtime-network-protection-receipt-v1";
35
+ readonly maximumAuthorities: 256;
36
+ readonly allocation: "all-current-affected-egress-receipts-before-reserving-any-lease";
37
+ readonly receiptSource: "joined-complete-native-protection-journal";
38
+ readonly unavailable: "null-native-barrier-removes-allocation-eligibility";
39
+ readonly historical: "retain-for-outbox-replay-never-current-allocation-eligibility";
40
+ readonly quarantine: "no-release-authority";
41
+ }>;
42
+ export declare const snapshotRuntimeNetworkProtectionReceiptV1: (value: unknown) => IRuntimeNetworkProtectionReceiptV1;
43
+ export declare const computeRuntimeNetworkProtectionReceiptV1Digest: (value: IRuntimeNetworkProtectionReceiptV1) => Promise<TSha256Digest>;
44
+ /** Pure revision binding. The owner must authenticate the reporter and fence all DB writes. */
45
+ export declare const admitRuntimeNetworkProtectionReceiptV1: (value: unknown, previousValue: unknown | null, trustedScopeValue: unknown, knownProtectionValue: unknown) => Promise<{
46
+ status: "accepted" | "replay";
47
+ receipt: IRuntimeNetworkProtectionReceiptV1;
48
+ }>;
49
+ export declare const snapshotReportRuntimeNetworkProtectionRequestV1: (value: unknown) => IReportRuntimeNetworkProtectionRequestV1;
50
+ /** Both trusted bindings come from the receiver's fenced physical-session/history owner. */
51
+ export declare const bindReportRuntimeNetworkProtectionRequestV1: (value: unknown, trustedCurrentSessionValue: unknown, trustedReporterSessionValue: unknown) => {
52
+ request: IReportRuntimeNetworkProtectionRequestV1;
53
+ authorityUse: "current" | "historical";
54
+ };
55
+ export declare const snapshotReportRuntimeNetworkProtectionResponseV1: (value: unknown) => IReportRuntimeNetworkProtectionResponseV1;
56
+ export declare const bindReportRuntimeNetworkProtectionResponseV1: (value: unknown, sentReceiptValue: unknown) => IReportRuntimeNetworkProtectionResponseV1;
57
+ /**
58
+ * Complete allocation prerequisite, not authentication or a native inspector.
59
+ * Inputs MUST be the current receiver-persisted receipts and CURRENT durable
60
+ * sessions, fenced together with protection and lease insertion. Never supply
61
+ * worker-authored lists or just online peers. Missing/offline/unavailable owners
62
+ * cannot be omitted. Independent fences need their own verified owning contract;
63
+ * this helper supplies no generic override, expiry or quorum escape hatch.
64
+ */
65
+ export declare const bindRuntimeNetworkAllocationProtectionV1: (protectionValue: unknown, receiptsValue: unknown, currentSessionsValue: unknown) => Promise<{
66
+ protection: IRuntimeNetworkProtectedAuthorityV1;
67
+ receipts: IRuntimeNetworkProtectionReceiptV1[];
68
+ }>;
@@ -0,0 +1,129 @@
1
+ import { snapshotRuntimeNetworkNodeScopeV1 } from './networkprojection.js';
2
+ import { computeRuntimeNetworkProtectedAuthorityV1Digest, snapshotRuntimeNetworkProtectedAuthorityV1 } from './networkauthority.js';
3
+ import { snapshotRuntimeSessionBindingV1 } from './runtimesession.js';
4
+ import { captureNetwork, failNetwork, networkCanonical, networkDigest, networkEqual, networkHash, networkId, networkList, networkRecord, networkReference, networkReferenceOf, networkRevision, networkSafe, networkSorted, requireNetwork } from '../private/networkcontract.js';
5
+ export const runtimeNetworkProtectionV1Contract = Object.freeze({
6
+ digestDomain: 'serve.zone/runtime-network-protection-receipt-v1',
7
+ maximumAuthorities: 256,
8
+ allocation: 'all-current-affected-egress-receipts-before-reserving-any-lease',
9
+ receiptSource: 'joined-complete-native-protection-journal',
10
+ unavailable: 'null-native-barrier-removes-allocation-eligibility',
11
+ historical: 'retain-for-outbox-replay-never-current-allocation-eligibility',
12
+ quarantine: 'no-release-authority',
13
+ });
14
+ const scopeOf = (value) => ({ controller: value.controller, nodeId: value.nodeId, runtimeNamespace: value.runtimeNamespace });
15
+ const scopeKey = (value) => networkCanonical([value.nodeId, value.runtimeNamespace]);
16
+ export const snapshotRuntimeNetworkProtectionReceiptV1 = (value) => networkSafe(() => {
17
+ const item = networkRecord(captureNetwork(value), ['schemaVersion', 'id', 'generation', 'previous',
18
+ 'controller', 'nodeId', 'runtimeNamespace', 'protectedAuthority', 'reporterSessionId', 'bootId', 'nativeBarrier', 'digest']);
19
+ requireNetwork(item.schemaVersion === 1 && typeof item.bootId === 'string'
20
+ && /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/.test(item.bootId)
21
+ && item.bootId !== '00000000-0000-0000-0000-000000000000');
22
+ const scope = snapshotRuntimeNetworkNodeScopeV1({ controller: item.controller, nodeId: item.nodeId, runtimeNamespace: item.runtimeNamespace });
23
+ return { schemaVersion: 1, ...networkRevision(item), ...scope,
24
+ protectedAuthority: networkReference(item.protectedAuthority), reporterSessionId: networkId(item.reporterSessionId),
25
+ bootId: item.bootId, nativeBarrier: item.nativeBarrier === null ? null : networkReference(item.nativeBarrier),
26
+ digest: networkDigest(item.digest) };
27
+ });
28
+ export const computeRuntimeNetworkProtectionReceiptV1Digest = (value) => networkHash(runtimeNetworkProtectionV1Contract.digestDomain, snapshotRuntimeNetworkProtectionReceiptV1(value));
29
+ /** Pure revision binding. The owner must authenticate the reporter and fence all DB writes. */
30
+ export const admitRuntimeNetworkProtectionReceiptV1 = async (value, previousValue, trustedScopeValue, knownProtectionValue) => {
31
+ try {
32
+ const receipt = snapshotRuntimeNetworkProtectionReceiptV1(value);
33
+ const previous = previousValue === null ? null : snapshotRuntimeNetworkProtectionReceiptV1(previousValue);
34
+ const scope = snapshotRuntimeNetworkNodeScopeV1(captureNetwork(trustedScopeValue));
35
+ const protection = snapshotRuntimeNetworkProtectedAuthorityV1(captureNetwork(knownProtectionValue));
36
+ requireNetwork(networkEqual(scopeOf(receipt), scope) && networkEqual(receipt.controller, protection.controller)
37
+ && networkEqual(receipt.protectedAuthority, networkReferenceOf(protection))
38
+ && protection.egressAuthorities.some(owner => scopeKey(owner) === scopeKey(receipt)));
39
+ requireNetwork(receipt.digest === await computeRuntimeNetworkProtectionReceiptV1Digest(receipt)
40
+ && protection.digest === await computeRuntimeNetworkProtectedAuthorityV1Digest(protection));
41
+ if (!previous)
42
+ requireNetwork(receipt.generation === 1 && receipt.previous === null);
43
+ else {
44
+ requireNetwork(networkEqual(scopeOf(previous), scope)
45
+ && previous.digest === await computeRuntimeNetworkProtectionReceiptV1Digest(previous));
46
+ if (networkEqual(receipt, previous))
47
+ return { status: 'replay', receipt };
48
+ requireNetwork(receipt.id === previous.id && receipt.generation === previous.generation + 1
49
+ && networkEqual(receipt.previous, networkReferenceOf(previous))
50
+ && receipt.protectedAuthority.id === previous.protectedAuthority.id
51
+ && receipt.protectedAuthority.generation >= previous.protectedAuthority.generation);
52
+ if (receipt.protectedAuthority.generation === previous.protectedAuthority.generation) {
53
+ requireNetwork(networkEqual(receipt.protectedAuthority, previous.protectedAuthority));
54
+ }
55
+ if (receipt.nativeBarrier && previous.nativeBarrier) {
56
+ if (receipt.bootId !== previous.bootId || !networkEqual(receipt.protectedAuthority, previous.protectedAuthority)) {
57
+ requireNetwork(!networkEqual(receipt.nativeBarrier, previous.nativeBarrier));
58
+ }
59
+ if (receipt.nativeBarrier.id === previous.nativeBarrier.id) {
60
+ requireNetwork(receipt.nativeBarrier.generation >= previous.nativeBarrier.generation);
61
+ if (receipt.nativeBarrier.generation === previous.nativeBarrier.generation) {
62
+ requireNetwork(networkEqual(receipt.nativeBarrier, previous.nativeBarrier));
63
+ }
64
+ }
65
+ }
66
+ }
67
+ return { status: 'accepted', receipt };
68
+ }
69
+ catch {
70
+ return failNetwork();
71
+ }
72
+ };
73
+ export const snapshotReportRuntimeNetworkProtectionRequestV1 = (value) => networkSafe(() => {
74
+ const item = networkRecord(captureNetwork(value), ['session', 'receipt']);
75
+ return { session: snapshotRuntimeSessionBindingV1(item.session), receipt: snapshotRuntimeNetworkProtectionReceiptV1(item.receipt) };
76
+ });
77
+ /** Both trusted bindings come from the receiver's fenced physical-session/history owner. */
78
+ export const bindReportRuntimeNetworkProtectionRequestV1 = (value, trustedCurrentSessionValue, trustedReporterSessionValue) => networkSafe(() => {
79
+ const request = snapshotReportRuntimeNetworkProtectionRequestV1(value);
80
+ const current = snapshotRuntimeSessionBindingV1(captureNetwork(trustedCurrentSessionValue));
81
+ const reporter = snapshotRuntimeSessionBindingV1(captureNetwork(trustedReporterSessionValue));
82
+ requireNetwork(networkEqual(request.session, current) && networkEqual(scopeOf(request.receipt), scopeOf(current))
83
+ && networkEqual(scopeOf(reporter), scopeOf(current)) && reporter.reporterSessionId === request.receipt.reporterSessionId);
84
+ const authorityUse = reporter.reporterSessionId === current.reporterSessionId ? 'current' : 'historical';
85
+ requireNetwork(authorityUse === 'current' ? networkEqual(reporter, current)
86
+ : reporter.sessionEpoch < current.sessionEpoch && reporter.credentialGeneration <= current.credentialGeneration);
87
+ return { request, authorityUse };
88
+ });
89
+ export const snapshotReportRuntimeNetworkProtectionResponseV1 = (value) => networkSafe(() => {
90
+ const item = networkRecord(captureNetwork(value), ['status', 'receipt', 'authorityUse']);
91
+ requireNetwork((item.status === 'accepted' || item.status === 'replay')
92
+ && (item.authorityUse === 'current' || item.authorityUse === 'historical'));
93
+ return { status: item.status, receipt: networkReference(item.receipt), authorityUse: item.authorityUse };
94
+ });
95
+ export const bindReportRuntimeNetworkProtectionResponseV1 = (value, sentReceiptValue) => networkSafe(() => {
96
+ const response = snapshotReportRuntimeNetworkProtectionResponseV1(value);
97
+ requireNetwork(networkEqual(response.receipt, networkReference(captureNetwork(sentReceiptValue))));
98
+ return response;
99
+ });
100
+ /**
101
+ * Complete allocation prerequisite, not authentication or a native inspector.
102
+ * Inputs MUST be the current receiver-persisted receipts and CURRENT durable
103
+ * sessions, fenced together with protection and lease insertion. Never supply
104
+ * worker-authored lists or just online peers. Missing/offline/unavailable owners
105
+ * cannot be omitted. Independent fences need their own verified owning contract;
106
+ * this helper supplies no generic override, expiry or quorum escape hatch.
107
+ */
108
+ export const bindRuntimeNetworkAllocationProtectionV1 = async (protectionValue, receiptsValue, currentSessionsValue) => {
109
+ try {
110
+ const protection = snapshotRuntimeNetworkProtectedAuthorityV1(captureNetwork(protectionValue));
111
+ const receipts = networkSorted(networkList(captureNetwork(receiptsValue), 256, snapshotRuntimeNetworkProtectionReceiptV1), scopeKey);
112
+ const sessions = networkSorted(networkList(captureNetwork(currentSessionsValue), 256, snapshotRuntimeSessionBindingV1), scopeKey);
113
+ requireNetwork(protection.digest === await computeRuntimeNetworkProtectedAuthorityV1Digest(protection)
114
+ && receipts.length === protection.egressAuthorities.length && sessions.length === receipts.length);
115
+ for (const [index, owner] of protection.egressAuthorities.entries()) {
116
+ const receipt = receipts[index], session = sessions[index];
117
+ requireNetwork(scopeKey(receipt) === scopeKey(owner) && scopeKey(session) === scopeKey(owner)
118
+ && networkEqual(receipt.controller, protection.controller) && networkEqual(session.controller, protection.controller)
119
+ && receipt.reporterSessionId === session.reporterSessionId && receipt.nativeBarrier !== null
120
+ && networkEqual(receipt.protectedAuthority, networkReferenceOf(protection))
121
+ && receipt.digest === await computeRuntimeNetworkProtectionReceiptV1Digest(receipt));
122
+ }
123
+ return { protection, receipts };
124
+ }
125
+ catch {
126
+ return failNetwork();
127
+ }
128
+ };
129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29ya3Byb3RlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL25ldHdvcmtwcm90ZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTNFLE9BQU8sRUFBRSwrQ0FBK0MsRUFBRSwwQ0FBMEMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXBJLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUM5RixTQUFTLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQzVGLFdBQVcsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUErQnBGLE1BQU0sQ0FBQyxNQUFNLGtDQUFrQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDOUQsWUFBWSxFQUFFLGtEQUFrRDtJQUNoRSxrQkFBa0IsRUFBRSxHQUFHO0lBQ3ZCLFVBQVUsRUFBRSxpRUFBaUU7SUFDN0UsYUFBYSxFQUFFLDJDQUEyQztJQUMxRCxXQUFXLEVBQUUsb0RBQW9EO0lBQ2pFLFVBQVUsRUFBRSwrREFBK0Q7SUFDM0UsVUFBVSxFQUFFLHNCQUFzQjtDQUMxQixDQUFDLENBQUM7QUFFWixNQUFNLE9BQU8sR0FBRyxDQUFDLEtBQWlDLEVBQThCLEVBQUUsQ0FDaEYsQ0FBQyxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7QUFDckcsTUFBTSxRQUFRLEdBQUcsQ0FBQyxLQUFtRCxFQUFVLEVB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
@@ -2,6 +2,13 @@ import * as plugins from '../plugins.js';
2
2
  import type * as data from '../data/runtimesession.js';
3
3
  import type * as terminal from '../data/runtimeterminalreceipt.js';
4
4
  import type * as network from '../data/networkdelivery.js';
5
+ import type * as protection from '../data/networkprotection.js';
6
+ /** Current authenticated peer reports its durable complete native protection journal. */
7
+ export interface IReq_Pallet_Controller_ReportRuntimeNetworkProtectionV1 extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Pallet_Controller_ReportRuntimeNetworkProtectionV1> {
8
+ method: 'reportRuntimeNetworkProtectionV1';
9
+ request: protection.IReportRuntimeNetworkProtectionRequestV1;
10
+ response: protection.IReportRuntimeNetworkProtectionResponseV1;
11
+ }
5
12
  /** Dedicated signing trust installed only through the current authenticated physical peer. */
6
13
  export interface IReq_Controller_Pallet_ApplyRuntimeNetworkSigningAuthorityV1 extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Controller_Pallet_ApplyRuntimeNetworkSigningAuthorityV1> {
7
14
  method: 'applyRuntimeNetworkSigningAuthorityV1';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@serve.zone/interfaces",
3
- "version": "30.8.1",
3
+ "version": "30.9.0",
4
4
  "private": false,
5
5
  "description": "Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.",
6
6
  "exports": {
package/readme.md CHANGED
@@ -265,6 +265,26 @@ the declaration is not a revocation acknowledgement. Prefix arrays are sorted
265
265
  lexically and nonoverlapping; pools and endpoints are sorted by ID; egress owners
266
266
  are ordered by canonical JSON of `[nodeId, runtimeNamespace]`.
267
267
 
268
+ `IRuntimeNetworkProtectionReceiptV1` reports a worker's durable, joined native
269
+ protection journal separately from projection admission. It binds a complete
270
+ protected-authority reference, node/controller scope, authenticated reporter,
271
+ boot identity and exact native journal reference to a monotonic receipt chain.
272
+ A null `nativeBarrier` explicitly removes allocation eligibility. A boot or
273
+ protection change requires new native journal evidence. These portable values
274
+ do not inspect a kernel or authenticate their own producer.
275
+
276
+ `reportRuntimeNetworkProtectionV1` uses the current authenticated physical peer.
277
+ Its request binder accepts a historical outbox only against receiver-owned
278
+ reporter history and identifies that use as historical. The response must match
279
+ the exact sent receipt. `bindRuntimeNetworkAllocationProtectionV1` requires the
280
+ current persisted protection receipt and durable session for every declared
281
+ egress owner, in canonical owner order. Missing, unavailable, stale-protection
282
+ and superseded-session evidence reject. An offline owner cannot be omitted.
283
+ The controller must fence all those records together with lease insertion, before
284
+ reserving any handoff or workload address. No generic independent-fence flag is
285
+ provided; such a mechanism needs its own verified owner. Protection receipts
286
+ neither prove workload readiness nor release packet/address/name quarantine.
287
+
268
288
  `IRuntimeNetworkHandoffLeaseV1` binds an immutable node/router incarnation to its
269
289
  protected-authority reference, transit subnet and peers, protocol-qualified source
270
290
  ports, nonzero conntrack zone and 128-bit label. The label is exactly 32 lowercase
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/interfaces',
6
- version: '30.8.1',
6
+ version: '30.9.0',
7
7
  description: 'Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.'
8
8
  }
package/ts/data/index.ts CHANGED
@@ -25,6 +25,7 @@ export * from './nodeenrollment.js';
25
25
  export * from './networkauthority.js';
26
26
  export * from './networkdelivery.js';
27
27
  export * from './networkprojection.js';
28
+ export * from './networkprotection.js';
28
29
  export * from './networksigning.js';
29
30
  export * from './privatenetwork.js';
30
31
  export * from './registry.js';
@@ -0,0 +1,175 @@
1
+ import type { TSha256Digest } from './immutableimage.js';
2
+ import type { IRuntimeAuthorityReferenceV1 } from './runtimeassignment.js';
3
+ import type { IRuntimeNetworkNodeScopeV1 } from './networkprojection.js';
4
+ import { snapshotRuntimeNetworkNodeScopeV1 } from './networkprojection.js';
5
+ import type { IRuntimeNetworkProtectedAuthorityV1 } from './networkauthority.js';
6
+ import { computeRuntimeNetworkProtectedAuthorityV1Digest, snapshotRuntimeNetworkProtectedAuthorityV1 } from './networkauthority.js';
7
+ import type { IRuntimeSessionBindingV1 } from './runtimesession.js';
8
+ import { snapshotRuntimeSessionBindingV1 } from './runtimesession.js';
9
+ import { captureNetwork, failNetwork, networkCanonical, networkDigest, networkEqual, networkHash,
10
+ networkId, networkList, networkRecord, networkReference, networkReferenceOf, networkRevision,
11
+ networkSafe, networkSorted, requireNetwork } from '../private/networkcontract.js';
12
+
13
+ /**
14
+ * Durable native protection report, independent of projection admission and DNS.
15
+ * The producer owns a joined native journal covering ALL affected local egress
16
+ * paths. nativeBarrier identifies that complete journal, never an admission ACK,
17
+ * a single table inspection, a boot event or a caller-selected success flag.
18
+ * A null nativeBarrier explicitly withdraws this node's allocation eligibility.
19
+ */
20
+ export interface IRuntimeNetworkProtectionReceiptV1 extends IRuntimeNetworkNodeScopeV1 {
21
+ schemaVersion: 1;
22
+ id: string;
23
+ generation: number;
24
+ previous: IRuntimeAuthorityReferenceV1 | null;
25
+ protectedAuthority: IRuntimeAuthorityReferenceV1;
26
+ reporterSessionId: string;
27
+ bootId: string;
28
+ nativeBarrier: IRuntimeAuthorityReferenceV1 | null;
29
+ digest: TSha256Digest;
30
+ }
31
+
32
+ export interface IReportRuntimeNetworkProtectionRequestV1 {
33
+ session: IRuntimeSessionBindingV1;
34
+ receipt: IRuntimeNetworkProtectionReceiptV1;
35
+ }
36
+ export interface IReportRuntimeNetworkProtectionResponseV1 {
37
+ status: 'accepted' | 'replay';
38
+ receipt: IRuntimeAuthorityReferenceV1;
39
+ authorityUse: 'current' | 'historical';
40
+ }
41
+
42
+ export const runtimeNetworkProtectionV1Contract = Object.freeze({
43
+ digestDomain: 'serve.zone/runtime-network-protection-receipt-v1',
44
+ maximumAuthorities: 256,
45
+ allocation: 'all-current-affected-egress-receipts-before-reserving-any-lease',
46
+ receiptSource: 'joined-complete-native-protection-journal',
47
+ unavailable: 'null-native-barrier-removes-allocation-eligibility',
48
+ historical: 'retain-for-outbox-replay-never-current-allocation-eligibility',
49
+ quarantine: 'no-release-authority',
50
+ } as const);
51
+
52
+ const scopeOf = (value: IRuntimeNetworkNodeScopeV1): IRuntimeNetworkNodeScopeV1 =>
53
+ ({ controller: value.controller, nodeId: value.nodeId, runtimeNamespace: value.runtimeNamespace });
54
+ const scopeKey = (value: { nodeId: string; runtimeNamespace: string }): string =>
55
+ networkCanonical([value.nodeId, value.runtimeNamespace]);
56
+
57
+ export const snapshotRuntimeNetworkProtectionReceiptV1 = (value: unknown): IRuntimeNetworkProtectionReceiptV1 => networkSafe(() => {
58
+ const item = networkRecord(captureNetwork(value), ['schemaVersion', 'id', 'generation', 'previous',
59
+ 'controller', 'nodeId', 'runtimeNamespace', 'protectedAuthority', 'reporterSessionId', 'bootId', 'nativeBarrier', 'digest']);
60
+ requireNetwork(item.schemaVersion === 1 && typeof item.bootId === 'string'
61
+ && /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/.test(item.bootId)
62
+ && item.bootId !== '00000000-0000-0000-0000-000000000000');
63
+ const scope = snapshotRuntimeNetworkNodeScopeV1({ controller: item.controller, nodeId: item.nodeId, runtimeNamespace: item.runtimeNamespace });
64
+ return { schemaVersion: 1, ...networkRevision(item), ...scope,
65
+ protectedAuthority: networkReference(item.protectedAuthority), reporterSessionId: networkId(item.reporterSessionId),
66
+ bootId: item.bootId, nativeBarrier: item.nativeBarrier === null ? null : networkReference(item.nativeBarrier),
67
+ digest: networkDigest(item.digest) };
68
+ });
69
+
70
+ export const computeRuntimeNetworkProtectionReceiptV1Digest = (value: IRuntimeNetworkProtectionReceiptV1): Promise<TSha256Digest> =>
71
+ networkHash(runtimeNetworkProtectionV1Contract.digestDomain, snapshotRuntimeNetworkProtectionReceiptV1(value));
72
+
73
+ /** Pure revision binding. The owner must authenticate the reporter and fence all DB writes. */
74
+ export const admitRuntimeNetworkProtectionReceiptV1 = async (
75
+ value: unknown, previousValue: unknown | null, trustedScopeValue: unknown, knownProtectionValue: unknown,
76
+ ): Promise<{ status: 'accepted' | 'replay'; receipt: IRuntimeNetworkProtectionReceiptV1 }> => {
77
+ try {
78
+ const receipt = snapshotRuntimeNetworkProtectionReceiptV1(value);
79
+ const previous = previousValue === null ? null : snapshotRuntimeNetworkProtectionReceiptV1(previousValue);
80
+ const scope = snapshotRuntimeNetworkNodeScopeV1(captureNetwork(trustedScopeValue));
81
+ const protection = snapshotRuntimeNetworkProtectedAuthorityV1(captureNetwork(knownProtectionValue));
82
+ requireNetwork(networkEqual(scopeOf(receipt), scope) && networkEqual(receipt.controller, protection.controller)
83
+ && networkEqual(receipt.protectedAuthority, networkReferenceOf(protection))
84
+ && protection.egressAuthorities.some(owner => scopeKey(owner) === scopeKey(receipt)));
85
+ requireNetwork(receipt.digest === await computeRuntimeNetworkProtectionReceiptV1Digest(receipt)
86
+ && protection.digest === await computeRuntimeNetworkProtectedAuthorityV1Digest(protection));
87
+ if (!previous) requireNetwork(receipt.generation === 1 && receipt.previous === null);
88
+ else {
89
+ requireNetwork(networkEqual(scopeOf(previous), scope)
90
+ && previous.digest === await computeRuntimeNetworkProtectionReceiptV1Digest(previous));
91
+ if (networkEqual(receipt, previous)) return { status: 'replay', receipt };
92
+ requireNetwork(receipt.id === previous.id && receipt.generation === previous.generation + 1
93
+ && networkEqual(receipt.previous, networkReferenceOf(previous))
94
+ && receipt.protectedAuthority.id === previous.protectedAuthority.id
95
+ && receipt.protectedAuthority.generation >= previous.protectedAuthority.generation);
96
+ if (receipt.protectedAuthority.generation === previous.protectedAuthority.generation) {
97
+ requireNetwork(networkEqual(receipt.protectedAuthority, previous.protectedAuthority));
98
+ }
99
+ if (receipt.nativeBarrier && previous.nativeBarrier) {
100
+ if (receipt.bootId !== previous.bootId || !networkEqual(receipt.protectedAuthority, previous.protectedAuthority)) {
101
+ requireNetwork(!networkEqual(receipt.nativeBarrier, previous.nativeBarrier));
102
+ }
103
+ if (receipt.nativeBarrier.id === previous.nativeBarrier.id) {
104
+ requireNetwork(receipt.nativeBarrier.generation >= previous.nativeBarrier.generation);
105
+ if (receipt.nativeBarrier.generation === previous.nativeBarrier.generation) {
106
+ requireNetwork(networkEqual(receipt.nativeBarrier, previous.nativeBarrier));
107
+ }
108
+ }
109
+ }
110
+ }
111
+ return { status: 'accepted', receipt };
112
+ } catch { return failNetwork(); }
113
+ };
114
+
115
+ export const snapshotReportRuntimeNetworkProtectionRequestV1 = (value: unknown): IReportRuntimeNetworkProtectionRequestV1 => networkSafe(() => {
116
+ const item = networkRecord(captureNetwork(value), ['session', 'receipt']);
117
+ return { session: snapshotRuntimeSessionBindingV1(item.session), receipt: snapshotRuntimeNetworkProtectionReceiptV1(item.receipt) };
118
+ });
119
+
120
+ /** Both trusted bindings come from the receiver's fenced physical-session/history owner. */
121
+ export const bindReportRuntimeNetworkProtectionRequestV1 = (
122
+ value: unknown, trustedCurrentSessionValue: unknown, trustedReporterSessionValue: unknown,
123
+ ): { request: IReportRuntimeNetworkProtectionRequestV1; authorityUse: 'current' | 'historical' } => networkSafe(() => {
124
+ const request = snapshotReportRuntimeNetworkProtectionRequestV1(value);
125
+ const current = snapshotRuntimeSessionBindingV1(captureNetwork(trustedCurrentSessionValue));
126
+ const reporter = snapshotRuntimeSessionBindingV1(captureNetwork(trustedReporterSessionValue));
127
+ requireNetwork(networkEqual(request.session, current) && networkEqual(scopeOf(request.receipt), scopeOf(current))
128
+ && networkEqual(scopeOf(reporter), scopeOf(current)) && reporter.reporterSessionId === request.receipt.reporterSessionId);
129
+ const authorityUse = reporter.reporterSessionId === current.reporterSessionId ? 'current' : 'historical';
130
+ requireNetwork(authorityUse === 'current' ? networkEqual(reporter, current)
131
+ : reporter.sessionEpoch < current.sessionEpoch && reporter.credentialGeneration <= current.credentialGeneration);
132
+ return { request, authorityUse };
133
+ });
134
+
135
+ export const snapshotReportRuntimeNetworkProtectionResponseV1 = (value: unknown): IReportRuntimeNetworkProtectionResponseV1 => networkSafe(() => {
136
+ const item = networkRecord(captureNetwork(value), ['status', 'receipt', 'authorityUse']);
137
+ requireNetwork((item.status === 'accepted' || item.status === 'replay')
138
+ && (item.authorityUse === 'current' || item.authorityUse === 'historical'));
139
+ return { status: item.status, receipt: networkReference(item.receipt), authorityUse: item.authorityUse };
140
+ });
141
+
142
+ export const bindReportRuntimeNetworkProtectionResponseV1 = (value: unknown, sentReceiptValue: unknown): IReportRuntimeNetworkProtectionResponseV1 => networkSafe(() => {
143
+ const response = snapshotReportRuntimeNetworkProtectionResponseV1(value);
144
+ requireNetwork(networkEqual(response.receipt, networkReference(captureNetwork(sentReceiptValue))));
145
+ return response;
146
+ });
147
+
148
+ /**
149
+ * Complete allocation prerequisite, not authentication or a native inspector.
150
+ * Inputs MUST be the current receiver-persisted receipts and CURRENT durable
151
+ * sessions, fenced together with protection and lease insertion. Never supply
152
+ * worker-authored lists or just online peers. Missing/offline/unavailable owners
153
+ * cannot be omitted. Independent fences need their own verified owning contract;
154
+ * this helper supplies no generic override, expiry or quorum escape hatch.
155
+ */
156
+ export const bindRuntimeNetworkAllocationProtectionV1 = async (
157
+ protectionValue: unknown, receiptsValue: unknown, currentSessionsValue: unknown,
158
+ ): Promise<{ protection: IRuntimeNetworkProtectedAuthorityV1; receipts: IRuntimeNetworkProtectionReceiptV1[] }> => {
159
+ try {
160
+ const protection = snapshotRuntimeNetworkProtectedAuthorityV1(captureNetwork(protectionValue));
161
+ const receipts = networkSorted(networkList(captureNetwork(receiptsValue), 256, snapshotRuntimeNetworkProtectionReceiptV1), scopeKey);
162
+ const sessions = networkSorted(networkList(captureNetwork(currentSessionsValue), 256, snapshotRuntimeSessionBindingV1), scopeKey);
163
+ requireNetwork(protection.digest === await computeRuntimeNetworkProtectedAuthorityV1Digest(protection)
164
+ && receipts.length === protection.egressAuthorities.length && sessions.length === receipts.length);
165
+ for (const [index, owner] of protection.egressAuthorities.entries()) {
166
+ const receipt = receipts[index], session = sessions[index];
167
+ requireNetwork(scopeKey(receipt) === scopeKey(owner) && scopeKey(session) === scopeKey(owner)
168
+ && networkEqual(receipt.controller, protection.controller) && networkEqual(session.controller, protection.controller)
169
+ && receipt.reporterSessionId === session.reporterSessionId && receipt.nativeBarrier !== null
170
+ && networkEqual(receipt.protectedAuthority, networkReferenceOf(protection))
171
+ && receipt.digest === await computeRuntimeNetworkProtectionReceiptV1Digest(receipt));
172
+ }
173
+ return { protection, receipts };
174
+ } catch { return failNetwork(); }
175
+ };
@@ -2,6 +2,16 @@ import * as plugins from '../plugins.js';
2
2
  import type * as data from '../data/runtimesession.js';
3
3
  import type * as terminal from '../data/runtimeterminalreceipt.js';
4
4
  import type * as network from '../data/networkdelivery.js';
5
+ import type * as protection from '../data/networkprotection.js';
6
+
7
+ /** Current authenticated peer reports its durable complete native protection journal. */
8
+ export interface IReq_Pallet_Controller_ReportRuntimeNetworkProtectionV1 extends plugins.typedrequestInterfaces.implementsTR<
9
+ plugins.typedrequestInterfaces.ITypedRequest, IReq_Pallet_Controller_ReportRuntimeNetworkProtectionV1
10
+ > {
11
+ method: 'reportRuntimeNetworkProtectionV1';
12
+ request: protection.IReportRuntimeNetworkProtectionRequestV1;
13
+ response: protection.IReportRuntimeNetworkProtectionResponseV1;
14
+ }
5
15
 
6
16
  /** Dedicated signing trust installed only through the current authenticated physical peer. */
7
17
  export interface IReq_Controller_Pallet_ApplyRuntimeNetworkSigningAuthorityV1 extends plugins.typedrequestInterfaces.implementsTR<