@serve.zone/interfaces 28.4.0 → 29.0.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,24 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026-09-09 - 29.0.0
4
+
5
+ ### Breaking Changes
6
+
7
+ - add authenticated runtime sessions and explicit runtime config null policies (runtime)
8
+ - Add runtime session data contracts and TypedRequest interfaces for pallet registration, assignment application, observation reporting, registry credential access, and Cloudly client session registration.
9
+ - Allow cpuMillis: null to explicitly request no CPU quota.
10
+ - Allow runAsUser and runAsGroup to be null together to delegate identity resolution to the pinned image OCI user policy, while rejecting partial null identities.
11
+ - Export the new runtime session contracts and document the v29 runtime contract changes.
12
+
13
+ ## 2026-09-09 - 28.5.0
14
+
15
+ ### Features
16
+
17
+ - add runtime config v1 contract (data/runtimeconfig)
18
+ - Introduce runtime config v1 interfaces for execution intent, target ports, readiness, log policy, and immutable image metadata.
19
+ - Add exact-schema snapshot validation, canonical digest computation, digest validation, and assignment binding helpers.
20
+ - Export the runtime config data module and add tests for digest vectors, schema bounds, assignment binding, and detached async snapshots.
21
+
3
22
  ## 2026-09-09 - 28.4.0
4
23
 
5
24
  ### Features
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/interfaces',
6
- version: '28.4.0',
6
+ version: '29.0.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=
@@ -24,6 +24,8 @@ export * from './nodecredential.js';
24
24
  export * from './nodeenrollment.js';
25
25
  export * from './registry.js';
26
26
  export * from './runtimeassignment.js';
27
+ export * from './runtimeconfig.js';
28
+ export * from './runtimesession.js';
27
29
  export * from './secret.js';
28
30
  export * from './baremetal.js';
29
31
  export * from './baseos.js';
@@ -24,6 +24,8 @@ export * from './nodecredential.js';
24
24
  export * from './nodeenrollment.js';
25
25
  export * from './registry.js';
26
26
  export * from './runtimeassignment.js';
27
+ export * from './runtimeconfig.js';
28
+ export * from './runtimesession.js';
27
29
  export * from './secret.js';
28
30
  export * from './baremetal.js';
29
31
  export * from './baseos.js';
@@ -38,4 +40,4 @@ export * from './traffic.js';
38
40
  export * from './user.js';
39
41
  export * from './version.js';
40
42
  export * from './webpush.js';
41
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxjQUFjLENBQUMifQ==
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxVQUFVLENBQUM7QUFDekIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsY0FBYyxDQUFDIn0=
@@ -0,0 +1,132 @@
1
+ import type { IImmutableContainerInvocationPlatformEvidenceV1, IImmutableContainerInvocationV1, TSha256Digest } from './immutableimage.js';
2
+ import type { IRuntimeAssignmentV1, IRuntimeAuthorityReferenceV1 } from './runtimeassignment.js';
3
+ /** A container target only; declaration does not publish a host or gateway port. */
4
+ export interface IRuntimeConfigTargetPortV1 {
5
+ name: string;
6
+ port: number;
7
+ /** Inclusive; equal to port for a single port. */
8
+ portEnd: number;
9
+ protocol: 'tcp' | 'udp';
10
+ }
11
+ export interface IRuntimeConfigReadinessTimingV1 {
12
+ /** Measured from the evidenced container start; no probes before this delay. */
13
+ initialDelayMs: number;
14
+ /** Failures during this startup grace cannot mark the workload unhealthy. */
15
+ startupGraceMs: number;
16
+ /** Probe start-to-start interval; probes must never overlap. */
17
+ intervalMs: number;
18
+ /** Per-probe deadline, including connection, TLS and HTTP response headers. */
19
+ timeoutMs: number;
20
+ /** Consecutive successful probes needed before ready becomes true. */
21
+ successThreshold: number;
22
+ /** Consecutive failures after startup grace needed to declare unhealthy. */
23
+ failureThreshold: number;
24
+ }
25
+ export type TRuntimeConfigReadinessV1 = IRuntimeConfigReadinessTimingV1 & ({
26
+ kind: 'process';
27
+ } | {
28
+ kind: 'tcp';
29
+ targetPort: string;
30
+ port: number;
31
+ } | {
32
+ kind: 'http';
33
+ targetPort: string;
34
+ port: number;
35
+ scheme: 'http' | 'https';
36
+ /**
37
+ * Host header name and HTTPS SNI/certificate hostname. Connect only to the
38
+ * evidenced container endpoint, never resolve this name as a probe target.
39
+ * HTTPS verifies system trust and this hostname; no insecure TLS mode.
40
+ */
41
+ host: string;
42
+ /** Canonical origin-form request target, including any nonsecret query. */
43
+ path: string;
44
+ /** Sorted unique final HTTP response status codes. */
45
+ expectedStatusCodes: number[];
46
+ /** A redirect response is evaluated as received; it cannot redirect probes. */
47
+ followRedirects: false;
48
+ });
49
+ export interface IRuntimeConfigLogPolicyV1 {
50
+ /** Maximum UTF-8 bytes in one captured stdout/stderr line. */
51
+ maximumLineBytes: number;
52
+ /** Maximum bytes waiting for delivery; overflow requires explicit evidence. */
53
+ maximumBufferedBytes: number;
54
+ /** Retention of archived logs; durable payloads belong to SmartBucket. */
55
+ retentionMs: number;
56
+ }
57
+ /**
58
+ * Controller-owned resolved nonsecret execution intent. OCI command, effective
59
+ * environment, working directory and identity policy must be resolved before
60
+ * sealing; consumers must not choose resource limits or identity policies.
61
+ * Secrets, network identity and storage claims remain separately assignment-bound
62
+ * owner references. This document contains no registry credentials or host paths.
63
+ */
64
+ export interface IRuntimeConfigV1 extends IRuntimeAuthorityReferenceV1 {
65
+ schemaVersion: 1;
66
+ organizationId: string;
67
+ serviceId: string;
68
+ image: {
69
+ registryHost: string;
70
+ repository: string;
71
+ /** Root descriptor digest, which may be an OCI platform index. */
72
+ imageDigest: TSha256Digest;
73
+ invocation: IImmutableContainerInvocationV1;
74
+ };
75
+ /** Complete effective public environment; secret values must never be inlined. */
76
+ environment: Record<string, string>;
77
+ workingDirectory: string;
78
+ /** null explicitly requests no CPU quota; zero and omitted values are invalid. */
79
+ cpuMillis: number | null;
80
+ memoryBytes: number;
81
+ readonlyRootfs: boolean;
82
+ /**
83
+ * Both identity fields must be numbers or both must be null. The null pair
84
+ * explicitly selects the pinned platform image's OCI User, including primary
85
+ * and supplemental group resolution against its immutable root filesystem.
86
+ * An absent OCI User retains the image/runtime specification's root identity.
87
+ * The execution owner must delegate that resolution to the qualified runtime;
88
+ * it must not guess a GID for a UID-only or named image user.
89
+ */
90
+ runAsUser: number | null;
91
+ /** Numeric override paired with runAsUser, or null for the image identity policy. */
92
+ runAsGroup: number | null;
93
+ /** Sorted unique names, with no overlapping ranges for the same transport. */
94
+ targetPorts: IRuntimeConfigTargetPortV1[];
95
+ readiness: TRuntimeConfigReadinessV1;
96
+ /**
97
+ * SmartData owns log metadata and SmartBucket owns archived payloads. This
98
+ * policy does not authorize persistent local files. Any CRI log capture uses
99
+ * disposable process-local transport artifacts and must evidence bounded
100
+ * buffering, backpressure and lost data; it must not silently truncate logs.
101
+ */
102
+ logs: IRuntimeConfigLogPolicyV1;
103
+ }
104
+ export interface IRuntimeConfigAssignmentBindingV1 {
105
+ config: IRuntimeConfigV1;
106
+ assignment: IRuntimeAssignmentV1;
107
+ platformEvidence: IImmutableContainerInvocationPlatformEvidenceV1;
108
+ }
109
+ export declare const runtimeConfigV1Contract: Readonly<{
110
+ readonly digestDomain: "serve.zone/runtime-config-v1";
111
+ readonly maximumCanonicalBytes: 262144;
112
+ readonly maximumEnvironmentEntries: 128;
113
+ readonly maximumTargetPorts: 64;
114
+ readonly maximumReadinessDurationMs: 3600000;
115
+ readonly maximumLogRetentionMs: 31536000000;
116
+ }>;
117
+ /**
118
+ * Detached exact-schema snapshot for synchronous persistence assertions. Digest
119
+ * integrity, scope authorization, admission and runtime readiness are not implied.
120
+ */
121
+ export declare const snapshotRuntimeConfigV1: (valueArg: unknown) => IRuntimeConfigV1;
122
+ /** Domain-separated canonical JSON excludes only the config's own digest. */
123
+ export declare const computeRuntimeConfigV1Digest: (configArg: IRuntimeConfigV1) => Promise<TSha256Digest>;
124
+ export declare const validateRuntimeConfigV1: (valueArg: unknown) => Promise<string[]>;
125
+ /**
126
+ * Bind valid content to one exact assignment and select its platform evidence.
127
+ * No assignment digest is embedded in the config, avoiding circular hashes.
128
+ * This proves content consistency only: the caller must authenticate the
129
+ * controller, durably admit the attempt, resolve other owner references, and
130
+ * verify runtime and readiness evidence before effects or route publication.
131
+ */
132
+ export declare const bindRuntimeConfigV1ToAssignment: (configArg: unknown, assignmentArg: unknown) => Promise<IRuntimeConfigAssignmentBindingV1>;
@@ -0,0 +1,278 @@
1
+ import { buildDigestPinnedImageReference, isSha256Digest, validateImmutableContainerInvocation, verifyImmutableContainerInvocationDigest, } from './immutableimage.js';
2
+ import { snapshotRuntimeAssignmentV1, validateRuntimeAssignmentV1 } from './runtimeassignment.js';
3
+ import { canonicalizeStrictJson, createCanonicalJsonSha256Hex } from '../private/canonicaljson.js';
4
+ export const runtimeConfigV1Contract = Object.freeze({
5
+ digestDomain: 'serve.zone/runtime-config-v1',
6
+ maximumCanonicalBytes: 262_144,
7
+ maximumEnvironmentEntries: 128,
8
+ maximumTargetPorts: 64,
9
+ maximumReadinessDurationMs: 3_600_000,
10
+ maximumLogRetentionMs: 31_536_000_000,
11
+ });
12
+ const fail = (messageArg) => { throw new Error(messageArg); };
13
+ const encoder = new TextEncoder();
14
+ const isInteger = (valueArg, minimumArg, maximumArg) => typeof valueArg === 'number' && Number.isSafeInteger(valueArg) && !Object.is(valueArg, -0)
15
+ && valueArg >= minimumArg && valueArg <= maximumArg;
16
+ const isIdentifier = (valueArg) => typeof valueArg === 'string' && /^[A-Za-z0-9][A-Za-z0-9:._-]{0,199}$/.test(valueArg);
17
+ const isDigest = (valueArg) => typeof valueArg === 'string' && isSha256Digest(valueArg);
18
+ const isPortName = (valueArg) => typeof valueArg === 'string' && /^[a-z0-9][a-z0-9_.-]{0,62}$/.test(valueArg);
19
+ const isExactRecord = (valueArg, keysArg) => {
20
+ if (!valueArg || typeof valueArg !== 'object' || Array.isArray(valueArg))
21
+ return false;
22
+ const keys = Object.keys(valueArg);
23
+ return keys.length === keysArg.length && keys.every((keyArg) => keysArg.includes(keyArg));
24
+ };
25
+ /**
26
+ * Bound traversal before canonicalization and copy descriptor values so input
27
+ * getters/toJSON never run. The canonical helper supplies scalar Unicode and
28
+ * safe-integer validation. Detached output is obtained before any async work.
29
+ */
30
+ const snapshotBoundedJson = (valueArg) => {
31
+ let nodes = 0;
32
+ let stringBytes = 0;
33
+ const ancestors = new Set();
34
+ const accountString = (value) => {
35
+ if (value.length > runtimeConfigV1Contract.maximumCanonicalBytes)
36
+ fail('runtime config string is oversized');
37
+ stringBytes += encoder.encode(value).byteLength;
38
+ if (stringBytes > runtimeConfigV1Contract.maximumCanonicalBytes)
39
+ fail('runtime config is oversized');
40
+ };
41
+ const copy = (value, depth) => {
42
+ if (++nodes > 8192 || depth > 12)
43
+ fail('runtime config exceeds structural bounds');
44
+ if (typeof value === 'string') {
45
+ accountString(value);
46
+ return value;
47
+ }
48
+ if (value === null || typeof value === 'boolean' || typeof value === 'number')
49
+ return value;
50
+ if (!value || typeof value !== 'object')
51
+ fail('runtime config contains a non-JSON value');
52
+ if (ancestors.has(value))
53
+ fail('runtime config contains a cycle');
54
+ ancestors.add(value);
55
+ try {
56
+ const array = Array.isArray(value);
57
+ const prototype = Object.getPrototypeOf(value);
58
+ if (array ? prototype !== Array.prototype : prototype !== Object.prototype && prototype !== null) {
59
+ fail('runtime config requires plain records and arrays');
60
+ }
61
+ const keys = Reflect.ownKeys(value);
62
+ if (keys.length > 257)
63
+ fail('runtime config object exceeds key bounds');
64
+ if (array) {
65
+ const lengthDescriptor = Object.getOwnPropertyDescriptor(value, 'length');
66
+ const length = lengthDescriptor?.value;
67
+ if (!isInteger(length, 0, 256) || keys.length !== length + 1) {
68
+ fail('runtime config requires bounded dense arrays');
69
+ }
70
+ const result = [];
71
+ for (let index = 0; index < length; index++) {
72
+ const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
73
+ if (!descriptor || !descriptor.enumerable || !Object.hasOwn(descriptor, 'value')) {
74
+ fail('runtime config array contains a missing or non-data entry');
75
+ }
76
+ result.push(copy(descriptor.value, depth + 1));
77
+ }
78
+ return result;
79
+ }
80
+ const result = Object.create(null);
81
+ for (const key of keys) {
82
+ if (typeof key !== 'string')
83
+ fail('runtime config contains a symbol key');
84
+ accountString(key);
85
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
86
+ if (!descriptor || !descriptor.enumerable || !Object.hasOwn(descriptor, 'value')) {
87
+ fail('runtime config requires enumerable data properties');
88
+ }
89
+ result[key] = copy(descriptor.value, depth + 1);
90
+ }
91
+ return result;
92
+ }
93
+ finally {
94
+ ancestors.delete(value);
95
+ }
96
+ };
97
+ const canonical = canonicalizeStrictJson(copy(valueArg, 0), fail);
98
+ if (encoder.encode(canonical).byteLength > runtimeConfigV1Contract.maximumCanonicalBytes) {
99
+ fail('runtime config canonical JSON is oversized');
100
+ }
101
+ return JSON.parse(canonical);
102
+ };
103
+ const timingKeys = ['initialDelayMs', 'startupGraceMs', 'intervalMs', 'timeoutMs',
104
+ 'successThreshold', 'failureThreshold'];
105
+ const assertReadiness = (valueArg, portsArg) => {
106
+ if (!valueArg || typeof valueArg !== 'object')
107
+ fail('runtime config readiness is required');
108
+ const value = valueArg;
109
+ const keys = value.kind === 'process' ? ['kind', ...timingKeys]
110
+ : value.kind === 'tcp' ? ['kind', ...timingKeys, 'targetPort', 'port']
111
+ : value.kind === 'http' ? ['kind', ...timingKeys, 'targetPort', 'port',
112
+ 'scheme', 'host', 'path', 'expectedStatusCodes', 'followRedirects'] : [];
113
+ if (keys.length === 0 || !isExactRecord(value, keys)
114
+ || !isInteger(value.initialDelayMs, 0, runtimeConfigV1Contract.maximumReadinessDurationMs)
115
+ || !isInteger(value.startupGraceMs, 0, runtimeConfigV1Contract.maximumReadinessDurationMs)
116
+ || !isInteger(value.intervalMs, 100, runtimeConfigV1Contract.maximumReadinessDurationMs)
117
+ || !isInteger(value.timeoutMs, 1, 60_000)
118
+ || !isInteger(value.successThreshold, 1, 100)
119
+ || !isInteger(value.failureThreshold, 1, 100)
120
+ || value.timeoutMs > value.intervalMs || value.initialDelayMs > value.startupGraceMs) {
121
+ fail('runtime config readiness must use explicit bounded timing and exact schema');
122
+ }
123
+ if (value.kind === 'process')
124
+ return;
125
+ const target = portsArg.find((portArg) => portArg.name === value.targetPort);
126
+ if (!isPortName(value.targetPort) || !target || target.protocol !== 'tcp'
127
+ || !isInteger(value.port, target.port, target.portEnd)) {
128
+ fail('runtime config readiness must select a declared TCP target and port');
129
+ }
130
+ if (value.kind === 'tcp')
131
+ return;
132
+ if ((value.scheme !== 'http' && value.scheme !== 'https') || value.followRedirects !== false
133
+ || typeof value.host !== 'string' || value.host.length > 253
134
+ || !/^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/.test(value.host)
135
+ || typeof value.path !== 'string' || value.path.length > 4096
136
+ || !value.path.startsWith('/') || value.path.startsWith('//')
137
+ || /[^\x21-\x7e]|[\\#]/.test(value.path)
138
+ || /%(?![0-9A-F]{2})/.test(value.path)
139
+ || !Array.isArray(value.expectedStatusCodes) || value.expectedStatusCodes.length === 0
140
+ || value.expectedStatusCodes.length > 32) {
141
+ fail('runtime config HTTP readiness must use an exact bounded request policy');
142
+ }
143
+ const parsed = new URL(value.path, 'http://runtime.invalid');
144
+ if (`${parsed.pathname}${parsed.search}` !== value.path)
145
+ fail('runtime config HTTP path must be canonical');
146
+ let previousCode = 0;
147
+ for (const code of value.expectedStatusCodes) {
148
+ if (!isInteger(code, 200, 599) || code <= previousCode) {
149
+ fail('runtime config HTTP status expectations must be sorted unique final codes');
150
+ }
151
+ previousCode = code;
152
+ }
153
+ };
154
+ const assertConfig = (valueArg) => {
155
+ if (!isExactRecord(valueArg, ['schemaVersion', 'id', 'generation', 'organizationId', 'serviceId',
156
+ 'image', 'environment', 'workingDirectory', 'cpuMillis', 'memoryBytes', 'readonlyRootfs',
157
+ 'runAsUser', 'runAsGroup', 'targetPorts', 'readiness', 'logs', 'digest'])
158
+ || valueArg.schemaVersion !== 1 || !isIdentifier(valueArg.id)
159
+ || !isInteger(valueArg.generation, 1, Number.MAX_SAFE_INTEGER)
160
+ || !isIdentifier(valueArg.organizationId) || !isIdentifier(valueArg.serviceId)
161
+ || !isDigest(valueArg.digest))
162
+ fail('runtime config must use its exact v1 schema');
163
+ const image = valueArg.image;
164
+ if (!isExactRecord(image, ['registryHost', 'repository', 'imageDigest', 'invocation'])
165
+ || typeof image.registryHost !== 'string' || image.registryHost.length > 253
166
+ || typeof image.repository !== 'string' || image.repository.length > 255
167
+ || !isDigest(image.imageDigest)
168
+ || validateImmutableContainerInvocation(image.invocation).length !== 0) {
169
+ fail('runtime config image must contain exact immutable invocation evidence');
170
+ }
171
+ buildDigestPinnedImageReference(image.registryHost, image.repository, image.imageDigest);
172
+ const environment = valueArg.environment;
173
+ if (!environment || typeof environment !== 'object' || Array.isArray(environment)
174
+ || Object.keys(environment).length > runtimeConfigV1Contract.maximumEnvironmentEntries) {
175
+ fail('runtime config requires an explicit bounded nonsecret environment');
176
+ }
177
+ for (const [key, value] of Object.entries(environment)) {
178
+ if (!/^[A-Za-z_][A-Za-z0-9_]{0,127}$/.test(key) || typeof value !== 'string'
179
+ || value.includes('\u0000') || encoder.encode(value).byteLength > 8192) {
180
+ fail('runtime config environment must contain bounded string entries');
181
+ }
182
+ }
183
+ const directory = valueArg.workingDirectory;
184
+ if (typeof directory !== 'string' || !directory.startsWith('/')
185
+ || encoder.encode(directory).byteLength > 4096 || /[\u0000-\u001f\u007f]/.test(directory)
186
+ || (directory !== '/' && directory.split('/').slice(1).some((partArg) => !partArg || partArg === '.' || partArg === '..'))
187
+ || !(valueArg.cpuMillis === null || isInteger(valueArg.cpuMillis, 1, 1_000_000))
188
+ || !isInteger(valueArg.memoryBytes, 16 * 1024 * 1024, 2 ** 50)
189
+ || typeof valueArg.readonlyRootfs !== 'boolean'
190
+ || !((valueArg.runAsUser === null && valueArg.runAsGroup === null)
191
+ || (isInteger(valueArg.runAsUser, 0, 2 ** 31 - 1) && isInteger(valueArg.runAsGroup, 0, 2 ** 31 - 1)))) {
192
+ fail('runtime config requires canonical directory and explicit resource and identity policies');
193
+ }
194
+ const ports = valueArg.targetPorts;
195
+ if (!Array.isArray(ports) || ports.length > runtimeConfigV1Contract.maximumTargetPorts) {
196
+ fail('runtime config target ports must be a bounded array');
197
+ }
198
+ let previousName = '';
199
+ const validatedPorts = [];
200
+ for (const port of ports) {
201
+ if (!isExactRecord(port, ['name', 'port', 'portEnd', 'protocol'])
202
+ || !isPortName(port.name) || port.name <= previousName
203
+ || !isInteger(port.port, 1, 65535) || !isInteger(port.portEnd, port.port, 65535)
204
+ || (port.protocol !== 'tcp' && port.protocol !== 'udp')
205
+ || validatedPorts.some((previousArg) => previousArg.protocol === port.protocol
206
+ && port.port <= previousArg.portEnd && port.portEnd >= previousArg.port)) {
207
+ fail('runtime config target ports require sorted unique names and nonoverlapping transport ranges');
208
+ }
209
+ previousName = port.name;
210
+ validatedPorts.push(port);
211
+ }
212
+ assertReadiness(valueArg.readiness, validatedPorts);
213
+ const logs = valueArg.logs;
214
+ if (!isExactRecord(logs, ['maximumLineBytes', 'maximumBufferedBytes', 'retentionMs'])
215
+ || !isInteger(logs.maximumLineBytes, 1, 1_048_576)
216
+ || !isInteger(logs.maximumBufferedBytes, 1, 67_108_864)
217
+ || logs.maximumBufferedBytes < logs.maximumLineBytes
218
+ || !isInteger(logs.retentionMs, 1, runtimeConfigV1Contract.maximumLogRetentionMs)) {
219
+ fail('runtime config logs require explicit bounded line, buffer and retention limits');
220
+ }
221
+ return valueArg;
222
+ };
223
+ /**
224
+ * Detached exact-schema snapshot for synchronous persistence assertions. Digest
225
+ * integrity, scope authorization, admission and runtime readiness are not implied.
226
+ */
227
+ export const snapshotRuntimeConfigV1 = (valueArg) => assertConfig(snapshotBoundedJson(valueArg));
228
+ /** Domain-separated canonical JSON excludes only the config's own digest. */
229
+ export const computeRuntimeConfigV1Digest = async (configArg) => {
230
+ const { digest: _digest, ...payload } = snapshotRuntimeConfigV1(configArg);
231
+ return `sha256:${await createCanonicalJsonSha256Hex(canonicalizeStrictJson({
232
+ domain: runtimeConfigV1Contract.digestDomain, payload,
233
+ }, fail), fail)}`;
234
+ };
235
+ const validateSnapshot = async (configArg) => {
236
+ if (!await verifyImmutableContainerInvocationDigest(configArg.image.invocation)) {
237
+ return ['runtime config immutable invocation digest does not match'];
238
+ }
239
+ return configArg.digest === await computeRuntimeConfigV1Digest(configArg)
240
+ ? [] : ['runtime config digest does not match'];
241
+ };
242
+ export const validateRuntimeConfigV1 = async (valueArg) => {
243
+ try {
244
+ return await validateSnapshot(snapshotRuntimeConfigV1(valueArg));
245
+ }
246
+ catch {
247
+ return ['runtime config must use its exact canonical v1 schema'];
248
+ }
249
+ };
250
+ /**
251
+ * Bind valid content to one exact assignment and select its platform evidence.
252
+ * No assignment digest is embedded in the config, avoiding circular hashes.
253
+ * This proves content consistency only: the caller must authenticate the
254
+ * controller, durably admit the attempt, resolve other owner references, and
255
+ * verify runtime and readiness evidence before effects or route publication.
256
+ */
257
+ export const bindRuntimeConfigV1ToAssignment = async (configArg, assignmentArg) => {
258
+ const config = snapshotRuntimeConfigV1(configArg);
259
+ const assignment = snapshotRuntimeAssignmentV1(snapshotBoundedJson(assignmentArg));
260
+ if ((await validateSnapshot(config)).length !== 0
261
+ || (await validateRuntimeAssignmentV1(assignment)).length !== 0) {
262
+ fail('runtime config binding requires valid config, invocation and assignment digests');
263
+ }
264
+ const reference = assignment.workload.config;
265
+ if (reference.id !== config.id || reference.generation !== config.generation
266
+ || reference.digest !== config.digest || assignment.organizationId !== config.organizationId
267
+ || assignment.serviceId !== config.serviceId
268
+ || assignment.workload.registryHost !== config.image.registryHost
269
+ || assignment.workload.repository !== config.image.repository
270
+ || assignment.workload.imageDigest !== config.image.imageDigest) {
271
+ fail('runtime config does not match the exact assignment reference, ownership and image');
272
+ }
273
+ const platformEvidence = config.image.invocation.evidence.find((entryArg) => entryArg.platform === assignment.workload.platform);
274
+ if (!platformEvidence)
275
+ fail('runtime config lacks exact assignment platform evidence');
276
+ return { config, assignment, platformEvidence };
277
+ };
278
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2RhdGEvcnVudGltZWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEVBQ0wsK0JBQStCLEVBQy9CLGNBQWMsRUFDZCxvQ0FBb0MsRUFDcEMsd0NBQXdDLEdBQ3pDLE1BQU0scUJBQXFCLENBQUM7QUFFN0IsT0FBTyxFQUFFLDJCQUEyQixFQUFFLDJCQUEyQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEcsT0FBTyxFQUFFLHNCQUFzQixFQUFFLDRCQUE0QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFnSG5HLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDbkQsWUFBWSxFQUFFLDhCQUE4QjtJQUM1QyxxQkFBcUIsRUFBRSxPQUFPO0lBQzlCLHlCQUF5QixFQUFFLEdBQUc7SUFDOUIsa0JBQWtCLEVBQUUsRUFBRTtJQUN0QiwwQkFBMEIsRUFBRSxTQUFTO0lBQ3JDLHFCQUFxQixFQUFFLGNBQWM7Q0FDN0IsQ0FBQyxDQUFDO0FBRVosTUFBTSxJQUFJLEdBQWtDLENBQUMsVUFBVSxFQUFFLEVBQUUsR0FBRyxNQUFNLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdGLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7QUFDbEMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxRQUFpQixFQUFFLFVBQWtCLEVBQUUsVUFBa0IsRUFBc0IsRUFBRSxDQUNsRyxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO09BQ3ZGLFFBQVEsSUFBSSxVQUFVLElBQUksUUFBUSxJQUFJLFVBQVUsQ0FBQztBQUN0RCxNQUFN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
@@ -0,0 +1,127 @@
1
+ import type { IIdentityCredential } from './user.js';
2
+ import type { IRuntimeAssignmentObservationV1, IRuntimeAssignmentReferenceV1, IRuntimeAssignmentV1, IRuntimeControllerV1 } from './runtimeassignment.js';
3
+ import type { IRuntimeConfigV1 } from './runtimeconfig.js';
4
+ /**
5
+ * Server-issued public binding for the current authenticated physical connection.
6
+ * It contains no bearer, peer ID or client-selected authority. A serialized binding
7
+ * is not authentication: every receiver must compare it with its live peer context.
8
+ * Onebox local execution uses the same shape with its own authenticated IPC owner.
9
+ */
10
+ export interface IRuntimeSessionBindingV1 {
11
+ schemaVersion: 1;
12
+ reporterSessionId: string;
13
+ nodeId: string;
14
+ credentialGeneration: number;
15
+ sessionEpoch: number;
16
+ controllerInstanceId: string;
17
+ controller: IRuntimeControllerV1;
18
+ runtimeNamespace: string;
19
+ }
20
+ /** Pallet-initiated WSS on its configured Cloudly HTTPS origin; never HTTP RPC. */
21
+ export interface IRegisterPalletRuntimeSessionRequestV1 {
22
+ schemaVersion: 1;
23
+ nodeId: string;
24
+ credentialGeneration: number;
25
+ /** Sensitive ephemeral input; exclude the complete request from hooks and logs. */
26
+ bearer: string;
27
+ }
28
+ export interface IApplyRuntimeAssignmentRequestV1 {
29
+ session: IRuntimeSessionBindingV1;
30
+ assignment: IRuntimeAssignmentV1;
31
+ config: IRuntimeConfigV1;
32
+ /** Exact removed incumbent for a new attempt; not assignment.previous. */
33
+ predecessor: IRuntimeAssignmentReferenceV1 | null;
34
+ }
35
+ /** Durable admission acknowledgement only; it asserts neither effects nor readiness. */
36
+ export interface IApplyRuntimeAssignmentResponseV1 {
37
+ status: 'accepted' | 'replay' | 'historical';
38
+ assignment: IRuntimeAssignmentReferenceV1;
39
+ }
40
+ export interface IReportRuntimeAssignmentObservationRequestV1 {
41
+ /** Always the CURRENT authenticated connection, including after credential rotation. */
42
+ session: IRuntimeSessionBindingV1;
43
+ /** Exact durable outbox body. Never rewrite reporterSessionId, digest or sequence. */
44
+ observation: IRuntimeAssignmentObservationV1;
45
+ }
46
+ export type TRuntimeObservationAuthorityUseV1 = 'current-session' | 'historical-recovery';
47
+ export interface IReportRuntimeAssignmentObservationResponseV1 {
48
+ /** Exact request body after a durable sequence/receipt transaction. */
49
+ observation: IRuntimeAssignmentObservationV1;
50
+ /**
51
+ * Historical recovery can advance the durable counter and ACK only. It must not
52
+ * update active readiness, routing or liveness; those require a fresh report
53
+ * from the current session. Neither classification is proof of writer fencing.
54
+ */
55
+ authorityUse: TRuntimeObservationAuthorityUseV1;
56
+ }
57
+ export interface IGetRuntimeRegistryCredentialRequestV1 {
58
+ session: IRuntimeSessionBindingV1;
59
+ /** The server must authorize this exact CURRENT assignment, including its node. */
60
+ assignment: IRuntimeAssignmentReferenceV1;
61
+ }
62
+ /** Sensitive ephemeral material; never persist, hash, log or include in diagnostics. */
63
+ export interface IGetRuntimeRegistryCredentialResponseV1 {
64
+ username: string;
65
+ password: string;
66
+ expiresAt: number;
67
+ }
68
+ /** Cloudly human/machine JWT registration on a physical TypedSocket; reject HTTP. */
69
+ export interface IRegisterCloudlyClientSessionRequestV1 {
70
+ schemaVersion: 1;
71
+ /** Authenticate the current JWT server-side; do not accept client identity claims. */
72
+ identity: IIdentityCredential;
73
+ }
74
+ export interface IRegisterCloudlyClientSessionResponseV1 {
75
+ /** Server-owned identity tagging completed; never trust a client-authored tag. */
76
+ registered: true;
77
+ }
78
+ export declare const runtimeSessionV1Contract: Readonly<{
79
+ readonly maximumWireCanonicalBytes: 327680;
80
+ readonly maximumCredentialBytes: 16384;
81
+ readonly maximumRegistryPasswordBytes: 8192;
82
+ readonly registerTransport: "pallet-initiated-wss-on-configured-cloudly-https-origin";
83
+ readonly historicalObservationAuthority: "durable-counter-and-ack-only";
84
+ readonly error: "Runtime session contract rejected.";
85
+ }>;
86
+ /** Synchronous detached structural assertion only; never an authentication check. */
87
+ export declare const snapshotRuntimeSessionBindingV1: (valueArg: unknown) => IRuntimeSessionBindingV1;
88
+ export declare const snapshotRegisterPalletRuntimeSessionRequestV1: (valueArg: unknown) => IRegisterPalletRuntimeSessionRequestV1;
89
+ export declare const snapshotApplyRuntimeAssignmentRequestV1: (valueArg: unknown) => IApplyRuntimeAssignmentRequestV1;
90
+ export declare const snapshotApplyRuntimeAssignmentResponseV1: (valueArg: unknown) => IApplyRuntimeAssignmentResponseV1;
91
+ export declare const snapshotReportRuntimeAssignmentObservationRequestV1: (valueArg: unknown) => IReportRuntimeAssignmentObservationRequestV1;
92
+ export declare const snapshotReportRuntimeAssignmentObservationResponseV1: (valueArg: unknown) => IReportRuntimeAssignmentObservationResponseV1;
93
+ export declare const snapshotGetRuntimeRegistryCredentialRequestV1: (valueArg: unknown) => IGetRuntimeRegistryCredentialRequestV1;
94
+ export declare const snapshotGetRuntimeRegistryCredentialResponseV1: (valueArg: unknown) => IGetRuntimeRegistryCredentialResponseV1;
95
+ export declare const snapshotRegisterCloudlyClientSessionRequestV1: (valueArg: unknown) => IRegisterCloudlyClientSessionRequestV1;
96
+ export declare const snapshotRegisterCloudlyClientSessionResponseV1: (valueArg: unknown) => IRegisterCloudlyClientSessionResponseV1;
97
+ /** Bind the authenticated Cloudly registration reply to the node and credential sent. */
98
+ export declare const bindRegisterPalletRuntimeSessionResponseV1: (valueArg: unknown, requestArg: unknown) => IRuntimeSessionBindingV1;
99
+ /** Reject already expired material; issuance policy and current assignment authority remain server-owned. */
100
+ export declare const bindGetRuntimeRegistryCredentialResponseV1: (valueArg: unknown, nowArg: number) => IGetRuntimeRegistryCredentialResponseV1;
101
+ /**
102
+ * Capture every input before awaiting digest verification. trustedSessionArg must
103
+ * come from the receiving live connection, never from another request field.
104
+ * This binds content only; durable CAS, slot admission and authority remain owners.
105
+ */
106
+ export declare const bindApplyRuntimeAssignmentRequestV1: (valueArg: unknown, trustedSessionArg: unknown) => Promise<IApplyRuntimeAssignmentRequestV1>;
107
+ /** Match an admission acknowledgement to the exact sent revision, including historical replies. */
108
+ export declare const bindApplyRuntimeAssignmentResponseV1: (valueArg: unknown, requestArg: unknown) => IApplyRuntimeAssignmentResponseV1;
109
+ /**
110
+ * trustedSessionArg is the CURRENT authenticated physical peer. reporterHistoryArg
111
+ * must be server-indexed immutable session history, obtained by the original
112
+ * observation's reporterSessionId; never accept caller-supplied history. All V1
113
+ * runtime sessions are Pallet-purpose sessions, so Spark history cannot qualify.
114
+ *
115
+ * This verifies content and classifies recovery, not authentication, history
116
+ * provenance, sequence admission or current authority. The server must transact
117
+ * receipt/counter acceptance under current credential and peer authority. A
118
+ * historical result MUST NOT restore active readiness, routes or liveness.
119
+ */
120
+ export declare const bindReportRuntimeAssignmentObservationRequestV1: (valueArg: unknown, assignmentArg: unknown, trustedSessionArg: unknown, reporterHistoryArg: unknown) => Promise<{
121
+ request: IReportRuntimeAssignmentObservationRequestV1;
122
+ authorityUse: TRuntimeObservationAuthorityUseV1;
123
+ }>;
124
+ /** Reject body rewriting and a historical receipt mislabeled as current authority. */
125
+ export declare const bindReportRuntimeAssignmentObservationResponseV1: (valueArg: unknown, requestArg: unknown) => IReportRuntimeAssignmentObservationResponseV1;
126
+ /** Current assignment lookup and live peer authorization remain mandatory server-owned inputs. */
127
+ export declare const bindGetRuntimeRegistryCredentialRequestV1: (valueArg: unknown, assignmentArg: unknown, trustedSessionArg: unknown) => Promise<IGetRuntimeRegistryCredentialRequestV1>;