@serve.zone/interfaces 32.27.0 → 32.28.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,21 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026-09-26 - 32.28.0
4
+
5
+ ### Features
6
+
7
+ - Let an administrator read the runtime local storage claims Cloudly issued.
8
+ - `requests.runtimesession.IReq_Any_Cloudly_GetRuntimeLocalStorageClaims`
9
+ (`getRuntimeLocalStorageClaims`): `{ identity, clusterId, nodeId?, cursor?, limit? }` →
10
+ `{ claims, nextCursor? }`, paged at most `runtimeLocalStorageClaimContract.maximumSummaryPageSize`
11
+ (200) summaries in ascending `claimId` order.
12
+ - `IRuntimeLocalStorageClaimSummary { claimId, generation, clusterId, nodeId, serviceId, volumeId,
13
+ mountPath, sourceKind, initialization, lifecycle, state }`, with `state` `null` until the node
14
+ acknowledged the generation; no digest, controller epoch or credential reference.
15
+ - `summarizeRuntimeLocalStorageClaim()`, `snapshotRuntimeLocalStorageClaimSummary()`,
16
+ `snapshotGetRuntimeLocalStorageClaimsRequest()`, `snapshotGetRuntimeLocalStorageClaimsResponse()`
17
+ and `bindGetRuntimeLocalStorageClaimsResponse()`.
18
+
3
19
  ## 2026-09-26 - 32.27.0
4
20
 
5
21
  ### Features
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/interfaces',
6
- version: '32.27.0',
6
+ version: '32.28.0',
7
7
  description: 'Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsV0FBVyxFQUFFLHVGQUF1RjtDQUNyRyxDQUFBIn0=
@@ -1,6 +1,7 @@
1
1
  import type { TSha256Digest } from './immutableimage.js';
2
2
  import type { IRuntimeAssignment, IRuntimeAuthorityReference, IRuntimeController } from './runtimeassignment.js';
3
3
  import type { IRuntimeSessionBinding } from './runtimesession.js';
4
+ import type { IIdentityCredential } from './user.js';
4
5
  /** A node-local directory the node derives from the claim's identity under a root only the node knows. */
5
6
  export type TRuntimeLocalStorageDirectorySource = {
6
7
  kind: 'directory';
@@ -136,6 +137,57 @@ export interface IApplyRuntimeLocalStorageClaimResponse {
136
137
  state: TRuntimeLocalStorageClaimState;
137
138
  claim: IRuntimeAuthorityReference;
138
139
  }
140
+ /**
141
+ * What an administrator reads about one local storage claim a controller issued: where the volume
142
+ * is, whose it is, how it starts and what its node last answered.
143
+ *
144
+ * It is a projection of the controller's current generation, never the claim itself: it carries no
145
+ * digest, no controller epoch and no source beyond its kind, so an SMB claim's credential reference
146
+ * is not in it. `claimId` is the claim's `id`, the name the node keys the volume by, including the
147
+ * `import/<claimId>` directory an operator places an `import` volume's bytes in; a reader takes it
148
+ * from here and never derives it.
149
+ *
150
+ * `state` is what the node answered about exactly `generation`, or `null` while the node has not
151
+ * acknowledged that generation. It follows the rule `bindApplyRuntimeLocalStorageClaimResponse`
152
+ * holds an answer to: a bound claim is `ready`, `import-required` (an `import` claim only) or
153
+ * `uncertain`; a purge is `purged` or `uncertain`.
154
+ */
155
+ export interface IRuntimeLocalStorageClaimSummary {
156
+ claimId: string;
157
+ generation: number;
158
+ clusterId: string;
159
+ nodeId: string;
160
+ serviceId: string;
161
+ volumeId: string;
162
+ mountPath: string;
163
+ sourceKind: TRuntimeLocalStorageSource['kind'];
164
+ initialization: IRuntimeLocalStorageClaim['initialization'];
165
+ lifecycle: TRuntimeLocalStorageLifecycle;
166
+ state: TRuntimeLocalStorageClaimState | null;
167
+ }
168
+ /**
169
+ * An administrator's read of the local storage claims of one cluster, optionally of one node.
170
+ *
171
+ * Paged: `cursor` is the opaque `nextCursor` of the previous page, and `limit` asks for at most that
172
+ * many summaries, which the controller may lower but never exceed; both absent read the first page
173
+ * at the controller's own size.
174
+ */
175
+ export interface IGetRuntimeLocalStorageClaimsRequest {
176
+ /** The controller verifies this credential and derives every actor claim itself. */
177
+ identity: IIdentityCredential;
178
+ clusterId: string;
179
+ nodeId?: string;
180
+ cursor?: string;
181
+ limit?: number;
182
+ }
183
+ /**
184
+ * One page of summaries in strictly ascending `claimId` order. `nextCursor` is omitted on the final
185
+ * page; a page that carries it carries at least one summary.
186
+ */
187
+ export interface IGetRuntimeLocalStorageClaimsResponse {
188
+ claims: IRuntimeLocalStorageClaimSummary[];
189
+ nextCursor?: string;
190
+ }
139
191
  export declare const runtimeLocalStorageClaimContract: Readonly<{
140
192
  readonly digestDomain: "serve.zone/runtime-local-storage-claim";
141
193
  readonly error: "Runtime local storage claim contract rejected.";
@@ -153,6 +205,11 @@ export declare const runtimeLocalStorageClaimContract: Readonly<{
153
205
  readonly maximumSegmentLength: 255;
154
206
  /** The longest SMB share name. */
155
207
  readonly maximumShareLength: 80;
208
+ /**
209
+ * The most claim summaries one `getRuntimeLocalStorageClaims` page carries. A page of summaries
210
+ * with every field at its bound stays inside the network contract's one-mebibyte capture.
211
+ */
212
+ readonly maximumSummaryPageSize: 200;
156
213
  }>;
157
214
  /** Detached exact-schema snapshot. The digest is a separate check. */
158
215
  export declare const snapshotRuntimeLocalStorageClaim: (valueArg: unknown) => IRuntimeLocalStorageClaim;
@@ -185,3 +242,22 @@ export declare const bindApplyRuntimeLocalStorageClaimRequest: (valueArg: unknow
185
242
  * newer generation the node holds, so its state is not judged against the sent claim.
186
243
  */
187
244
  export declare const bindApplyRuntimeLocalStorageClaimResponse: (valueArg: unknown, requestArg: unknown) => IApplyRuntimeLocalStorageClaimResponse;
245
+ /** Detached exact-schema snapshot of one summary, its state judged against its lifecycle. */
246
+ export declare const snapshotRuntimeLocalStorageClaimSummary: (valueArg: unknown) => IRuntimeLocalStorageClaimSummary;
247
+ /**
248
+ * The one projection of a claim and its node's last answer into a summary. `stateArg` is what the
249
+ * node answered about exactly this generation, or `null` while it has not acknowledged it.
250
+ */
251
+ export declare const summarizeRuntimeLocalStorageClaim: (claimArg: unknown, stateArg: TRuntimeLocalStorageClaimState | null) => IRuntimeLocalStorageClaimSummary;
252
+ /**
253
+ * Detached exact-schema snapshot of a read request. It checks the identity's shape only: the
254
+ * controller authenticates it.
255
+ */
256
+ export declare const snapshotGetRuntimeLocalStorageClaimsRequest: (valueArg: unknown) => IGetRuntimeLocalStorageClaimsRequest;
257
+ /** Detached exact-schema snapshot of one page: bounded, strictly ascending and never empty with a cursor. */
258
+ export declare const snapshotGetRuntimeLocalStorageClaimsResponse: (valueArg: unknown) => IGetRuntimeLocalStorageClaimsResponse;
259
+ /**
260
+ * Matches a page to the read that asked for it: every summary names the requested cluster and, when
261
+ * the request named one, the requested node, and the page holds no more than the requested `limit`.
262
+ */
263
+ export declare const bindGetRuntimeLocalStorageClaimsResponse: (valueArg: unknown, requestArg: unknown) => IGetRuntimeLocalStorageClaimsResponse;
@@ -1,6 +1,6 @@
1
1
  import { snapshotRuntimeAssignment, validateRuntimeAssignment } from './runtimeassignment.js';
2
2
  import { snapshotRuntimeSessionBinding } from './runtimesession.js';
3
- import { captureNetwork, networkController, networkDigest, networkEqual, networkHash, networkId, networkNodeId, networkRecord, networkReference, networkReferenceOf, networkRevision, requireNetwork, } from '../private/networkcontract.js';
3
+ import { captureNetwork, networkController, networkCounter, networkDigest, networkEqual, networkHash, networkId, networkList, networkNodeId, networkRecord, networkReference, networkReferenceOf, networkRevision, networkSorted, requireNetwork, } from '../private/networkcontract.js';
4
4
  import { parseCanonicalIpAddress } from '../private/ipaddress.js';
5
5
  import { isRuntimeIdentityNumber } from '../private/runtimepolicy.js';
6
6
  import { createStorageContractReaders } from '../private/storagecontract.js';
@@ -21,6 +21,11 @@ export const runtimeLocalStorageClaimContract = Object.freeze({
21
21
  maximumSegmentLength: 255,
22
22
  /** The longest SMB share name. */
23
23
  maximumShareLength: 80,
24
+ /**
25
+ * The most claim summaries one `getRuntimeLocalStorageClaims` page carries. A page of summaries
26
+ * with every field at its bound stays inside the network contract's one-mebibyte capture.
27
+ */
28
+ maximumSummaryPageSize: 200,
24
29
  });
25
30
  const fail = () => { throw new Error(runtimeLocalStorageClaimContract.error); };
26
31
  const safe = (operationArg) => { try {
@@ -79,6 +84,11 @@ const shareOf = (valueArg) => {
79
84
  && isPathSegment(valueArg) && !shareForbiddenPattern.test(valueArg));
80
85
  return valueArg;
81
86
  };
87
+ /** The states a node may answer about one generation, whatever the answer's status. */
88
+ const isClaimStateOf = (claimArg, stateArg) => claimArg.lifecycle === 'purge'
89
+ ? stateArg === 'purged' || stateArg === 'uncertain'
90
+ : stateArg === 'ready' || stateArg === 'uncertain'
91
+ || (stateArg === 'import-required' && claimArg.initialization === 'import');
82
92
  const literalOf = (valueArg, allowedArg) => {
83
93
  requireNetwork(allowedArg.includes(valueArg));
84
94
  return valueArg;
@@ -243,12 +253,93 @@ export const bindApplyRuntimeLocalStorageClaimResponse = (valueArg, requestArg)
243
253
  const response = snapshotApplyRuntimeLocalStorageClaimResponse(valueArg);
244
254
  const { claim } = snapshotApplyRuntimeLocalStorageClaimRequest(requestArg);
245
255
  requireNetwork(networkEqual(response.claim, getRuntimeLocalStorageClaimReference(claim)));
246
- if (response.status !== 'historical') {
247
- requireNetwork(claim.lifecycle === 'purge'
248
- ? response.state === 'purged' || response.state === 'uncertain'
249
- : response.state === 'ready' || response.state === 'uncertain'
250
- || (response.state === 'import-required' && claim.initialization === 'import'));
251
- }
256
+ if (response.status !== 'historical')
257
+ requireNetwork(isClaimStateOf(claim, response.state));
258
+ return response;
259
+ });
260
+ const sourceKinds = ['directory', 'nfs', 'smb'];
261
+ const initializations = ['empty', 'import'];
262
+ const lifecycles = ['bound', 'purge'];
263
+ /** Detached exact-schema snapshot of one summary, its state judged against its lifecycle. */
264
+ export const snapshotRuntimeLocalStorageClaimSummary = (valueArg) => safe(() => {
265
+ const value = networkRecord(captureNetwork(valueArg), ['claimId', 'generation', 'clusterId', 'nodeId',
266
+ 'serviceId', 'volumeId', 'mountPath', 'sourceKind', 'initialization', 'lifecycle', 'state']);
267
+ const summary = {
268
+ claimId: networkId(value.claimId),
269
+ generation: networkCounter(value.generation),
270
+ clusterId: networkId(value.clusterId),
271
+ nodeId: networkNodeId(value.nodeId),
272
+ serviceId: networkId(value.serviceId),
273
+ volumeId: networkId(value.volumeId),
274
+ mountPath: readMountPath(value.mountPath, 'mountPath'),
275
+ sourceKind: literalOf(value.sourceKind, sourceKinds),
276
+ initialization: literalOf(value.initialization, initializations),
277
+ lifecycle: literalOf(value.lifecycle, lifecycles),
278
+ state: value.state === null ? null : literalOf(value.state, claimStates),
279
+ };
280
+ // A purge always follows a bound generation, and an SMB volume always starts empty.
281
+ requireNetwork((summary.lifecycle === 'bound' || summary.generation > 1)
282
+ && (summary.sourceKind !== 'smb' || summary.initialization === 'empty')
283
+ && (summary.state === null || isClaimStateOf(summary, summary.state)));
284
+ return summary;
285
+ });
286
+ /**
287
+ * The one projection of a claim and its node's last answer into a summary. `stateArg` is what the
288
+ * node answered about exactly this generation, or `null` while it has not acknowledged it.
289
+ */
290
+ export const summarizeRuntimeLocalStorageClaim = (claimArg, stateArg) => {
291
+ const claim = snapshotRuntimeLocalStorageClaim(claimArg);
292
+ return snapshotRuntimeLocalStorageClaimSummary({
293
+ claimId: claim.id,
294
+ generation: claim.generation,
295
+ clusterId: claim.clusterId,
296
+ nodeId: claim.nodeId,
297
+ serviceId: claim.serviceId,
298
+ volumeId: claim.volumeId,
299
+ mountPath: claim.mount.mountPath,
300
+ sourceKind: claim.source.kind,
301
+ initialization: claim.initialization,
302
+ lifecycle: claim.lifecycle,
303
+ state: stateArg,
304
+ });
305
+ };
306
+ /**
307
+ * Detached exact-schema snapshot of a read request. It checks the identity's shape only: the
308
+ * controller authenticates it.
309
+ */
310
+ export const snapshotGetRuntimeLocalStorageClaimsRequest = (valueArg) => safe(() => {
311
+ const value = networkRecord(captureNetwork(valueArg), ['identity', 'clusterId'], ['nodeId', 'cursor', 'limit']);
312
+ const identity = networkRecord(value.identity, ['jwt']);
313
+ requireNetwork(typeof identity.jwt === 'string' && identity.jwt.length > 0);
314
+ return {
315
+ identity: { jwt: identity.jwt },
316
+ clusterId: networkId(value.clusterId),
317
+ ...(Object.hasOwn(value, 'nodeId') ? { nodeId: networkNodeId(value.nodeId) } : {}),
318
+ ...(Object.hasOwn(value, 'cursor') ? { cursor: networkId(value.cursor) } : {}),
319
+ ...(Object.hasOwn(value, 'limit')
320
+ ? { limit: networkCounter(value.limit, runtimeLocalStorageClaimContract.maximumSummaryPageSize) } : {}),
321
+ };
322
+ });
323
+ /** Detached exact-schema snapshot of one page: bounded, strictly ascending and never empty with a cursor. */
324
+ export const snapshotGetRuntimeLocalStorageClaimsResponse = (valueArg) => safe(() => {
325
+ const value = networkRecord(captureNetwork(valueArg), ['claims'], ['nextCursor']);
326
+ const claims = networkList(value.claims, runtimeLocalStorageClaimContract.maximumSummaryPageSize, snapshotRuntimeLocalStorageClaimSummary);
327
+ networkSorted(claims, (claimArg) => claimArg.claimId);
328
+ if (!Object.hasOwn(value, 'nextCursor'))
329
+ return { claims };
330
+ requireNetwork(claims.length > 0);
331
+ return { claims, nextCursor: networkId(value.nextCursor) };
332
+ });
333
+ /**
334
+ * Matches a page to the read that asked for it: every summary names the requested cluster and, when
335
+ * the request named one, the requested node, and the page holds no more than the requested `limit`.
336
+ */
337
+ export const bindGetRuntimeLocalStorageClaimsResponse = (valueArg, requestArg) => safe(() => {
338
+ const response = snapshotGetRuntimeLocalStorageClaimsResponse(valueArg);
339
+ const request = snapshotGetRuntimeLocalStorageClaimsRequest(requestArg);
340
+ requireNetwork(response.claims.length <= (request.limit ?? runtimeLocalStorageClaimContract.maximumSummaryPageSize)
341
+ && response.claims.every((claimArg) => claimArg.clusterId === request.clusterId
342
+ && (request.nodeId === undefined || claimArg.nodeId === request.nodeId)));
252
343
  return response;
253
344
  });
254
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZWxvY2Fsc3RvcmFnZWNsYWltLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZGF0YS9ydW50aW1lbG9jYWxzdG9yYWdlY2xhaW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLHlCQUF5QixFQUFFLHlCQUF5QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFOUYsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQzdGLGFBQWEsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLGNBQWMsR0FDcEcsTUFBTSwrQkFBK0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQXlKN0UsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUM1RCxZQUFZLEVBQUUsd0NBQXdDO0lBQ3RELEtBQUssRUFBRSxnREFBZ0Q7SUFDdkQsVUFBVSxFQUFFLGVBQWU7SUFDM0IsYUFBYSxFQUFFLFFBQVE7SUFDdkIsbUZBQW1GO0lBQ25GLGlCQUFpQixFQUFFLE1BQU07SUFDekIsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO0lBQ3ZDLFdBQVcsRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDO0lBQ3JDLHFFQUFxRTtJQUNyRSxtQkFBbUIsRUFBRSxHQUFHO0lBQ3hCLDRGQUE0RjtJQUM1RixpQkFBaUIsRUFBRSxJ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
345
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZWxvY2Fsc3RvcmFnZWNsYWltLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZGF0YS9ydW50aW1lbG9jYWxzdG9yYWdlY2xhaW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLHlCQUF5QixFQUFFLHlCQUF5QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFOUYsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFcEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUM3RyxXQUFXLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUMvRyxjQUFjLEdBQ2YsTUFBTSwrQkFBK0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQStNN0UsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUM1RCxZQUFZLEVBQUUsd0NBQXdDO0lBQ3RELEtBQUssRUFBRSxnREFBZ0Q7SUFDdkQsVUFBVSxFQUFFLGVBQWU7SUFDM0IsYUFBYSxFQUFFLFFBQVE7SUFDdkIsbUZBQW1GO0lBQ25GLGlCQUFpQixFQUFFLE1BQU07SUFDekIsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO0lBQ3ZDLFdBQVcsRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDO0lBQ3JDLHFFQUFxRTtJQUNyRSxtQkFBbUIsRUFBRSxHQUFHO0lB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
@@ -137,6 +137,18 @@ export interface IReq_Controller_Pallet_ApplyRuntimeLocalStorageClaim extends pl
137
137
  request: localStorage.IApplyRuntimeLocalStorageClaimRequest;
138
138
  response: localStorage.IApplyRuntimeLocalStorageClaimResponse;
139
139
  }
140
+ /**
141
+ * An administrator reads the local storage claims Cloudly issued in one cluster, optionally on one
142
+ * node, one page at a time: each claim's id, volume, mount path, initialization, lifecycle and what
143
+ * its node last answered. `snapshotGetRuntimeLocalStorageClaimsRequest` and
144
+ * `bindGetRuntimeLocalStorageClaimsResponse` judge both sides; a summary never carries the claim's
145
+ * source beyond its kind, so no credential reference leaves Cloudly through it.
146
+ */
147
+ export interface IReq_Any_Cloudly_GetRuntimeLocalStorageClaims extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Any_Cloudly_GetRuntimeLocalStorageClaims> {
148
+ method: 'getRuntimeLocalStorageClaims';
149
+ request: localStorage.IGetRuntimeLocalStorageClaimsRequest;
150
+ response: localStorage.IGetRuntimeLocalStorageClaimsResponse;
151
+ }
140
152
  /** Current-peer report, including exact historical outbox recovery after reconnect. */
141
153
  export interface IReq_Pallet_Controller_ReportRuntimeAssignmentObservation extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_Pallet_Controller_ReportRuntimeAssignmentObservation> {
142
154
  method: 'reportRuntimeAssignmentObservation';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@serve.zone/interfaces",
3
- "version": "32.27.0",
3
+ "version": "32.28.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
@@ -2066,6 +2066,29 @@ answer to the sent claim and, for `accepted` and `replay`, to a state the claim
2066
2066
  claim is `ready`, `import-required` (an `import` claim only) or `uncertain`, a purge is `purged` or
2067
2067
  `uncertain`. A `historical` answer describes the newer generation the node holds.
2068
2068
 
2069
+ `requests.runtimesession.IReq_Any_Cloudly_GetRuntimeLocalStorageClaims`
2070
+ (`getRuntimeLocalStorageClaims`) lets an administrator read the claims Cloudly issued in one
2071
+ cluster, optionally on one node: `{ identity, clusterId, nodeId?, cursor?, limit? }` →
2072
+ `{ claims, nextCursor? }`. Each entry is an `IRuntimeLocalStorageClaimSummary { claimId,
2073
+ generation, clusterId, nodeId, serviceId, volumeId, mountPath, sourceKind, initialization,
2074
+ lifecycle, state }` of the current generation. `claimId` is the claim's `id`, the name the node
2075
+ keys the volume by and the `import/<claimId>` directory an operator places an `import` volume's
2076
+ bytes in; a reader takes it from here and never derives it, because how a controller composes its
2077
+ claim ids is the controller's own business. `state` is what the node answered about exactly that
2078
+ generation, or `null` until the node acknowledged it, and it obeys the same rule as an apply answer.
2079
+ A summary names the source by kind alone and carries no digest, controller epoch or SMB credential
2080
+ reference.
2081
+
2082
+ The read is paged: `cursor` is the opaque `nextCursor` of the previous page, `limit` is at most
2083
+ `runtimeLocalStorageClaimContract.maximumSummaryPageSize` (200), the page is in strictly ascending
2084
+ `claimId` order, and `nextCursor` is omitted on the final page and never stated on an empty one.
2085
+ `summarizeRuntimeLocalStorageClaim(claim, state)` is the one projection of a claim into a summary,
2086
+ `snapshotRuntimeLocalStorageClaimSummary` and `snapshotGetRuntimeLocalStorageClaimsRequest` /
2087
+ `snapshotGetRuntimeLocalStorageClaimsResponse` check exact schemas, and
2088
+ `bindGetRuntimeLocalStorageClaimsResponse(response, request)` binds a page to the read that asked
2089
+ for it: every summary names the requested cluster and node, and the page holds no more than the
2090
+ requested `limit`.
2091
+
2069
2092
  `platform.storagemigration` defines the provider-neutral cutover contract for a
2070
2093
  named object-storage binding. Corestore atomically owns and fences the source
2071
2094
  binding after validating a distinct, unfenced active-object snapshot. Onebox
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/interfaces',
6
- version: '32.27.0',
6
+ version: '32.28.0',
7
7
  description: 'Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.'
8
8
  }
@@ -3,8 +3,10 @@ import type { IRuntimeAssignment, IRuntimeAuthorityReference, IRuntimeController
3
3
  import { snapshotRuntimeAssignment, validateRuntimeAssignment } from './runtimeassignment.js';
4
4
  import type { IRuntimeSessionBinding } from './runtimesession.js';
5
5
  import { snapshotRuntimeSessionBinding } from './runtimesession.js';
6
- import { captureNetwork, networkController, networkDigest, networkEqual, networkHash, networkId,
7
- networkNodeId, networkRecord, networkReference, networkReferenceOf, networkRevision, requireNetwork,
6
+ import type { IIdentityCredential } from './user.js';
7
+ import { captureNetwork, networkController, networkCounter, networkDigest, networkEqual, networkHash, networkId,
8
+ networkList, networkNodeId, networkRecord, networkReference, networkReferenceOf, networkRevision, networkSorted,
9
+ requireNetwork,
8
10
  } from '../private/networkcontract.js';
9
11
  import { parseCanonicalIpAddress } from '../private/ipaddress.js';
10
12
  import { isRuntimeIdentityNumber } from '../private/runtimepolicy.js';
@@ -161,6 +163,60 @@ export interface IApplyRuntimeLocalStorageClaimResponse {
161
163
  claim: IRuntimeAuthorityReference;
162
164
  }
163
165
 
166
+ /**
167
+ * What an administrator reads about one local storage claim a controller issued: where the volume
168
+ * is, whose it is, how it starts and what its node last answered.
169
+ *
170
+ * It is a projection of the controller's current generation, never the claim itself: it carries no
171
+ * digest, no controller epoch and no source beyond its kind, so an SMB claim's credential reference
172
+ * is not in it. `claimId` is the claim's `id`, the name the node keys the volume by, including the
173
+ * `import/<claimId>` directory an operator places an `import` volume's bytes in; a reader takes it
174
+ * from here and never derives it.
175
+ *
176
+ * `state` is what the node answered about exactly `generation`, or `null` while the node has not
177
+ * acknowledged that generation. It follows the rule `bindApplyRuntimeLocalStorageClaimResponse`
178
+ * holds an answer to: a bound claim is `ready`, `import-required` (an `import` claim only) or
179
+ * `uncertain`; a purge is `purged` or `uncertain`.
180
+ */
181
+ export interface IRuntimeLocalStorageClaimSummary {
182
+ claimId: string;
183
+ generation: number;
184
+ clusterId: string;
185
+ nodeId: string;
186
+ serviceId: string;
187
+ volumeId: string;
188
+ mountPath: string;
189
+ sourceKind: TRuntimeLocalStorageSource['kind'];
190
+ initialization: IRuntimeLocalStorageClaim['initialization'];
191
+ lifecycle: TRuntimeLocalStorageLifecycle;
192
+ state: TRuntimeLocalStorageClaimState | null;
193
+ }
194
+
195
+ /**
196
+ * An administrator's read of the local storage claims of one cluster, optionally of one node.
197
+ *
198
+ * Paged: `cursor` is the opaque `nextCursor` of the previous page, and `limit` asks for at most that
199
+ * many summaries, which the controller may lower but never exceed; both absent read the first page
200
+ * at the controller's own size.
201
+ */
202
+ export interface IGetRuntimeLocalStorageClaimsRequest {
203
+ /** The controller verifies this credential and derives every actor claim itself. */
204
+ identity: IIdentityCredential;
205
+ clusterId: string;
206
+ nodeId?: string;
207
+ cursor?: string;
208
+ limit?: number;
209
+ }
210
+
211
+ /**
212
+ * One page of summaries in strictly ascending `claimId` order. `nextCursor` is omitted on the final
213
+ * page; a page that carries it carries at least one summary.
214
+ */
215
+ export interface IGetRuntimeLocalStorageClaimsResponse {
216
+ claims: IRuntimeLocalStorageClaimSummary[];
217
+ nextCursor?: string;
218
+ }
219
+
164
220
  export const runtimeLocalStorageClaimContract = Object.freeze({
165
221
  digestDomain: 'serve.zone/runtime-local-storage-claim',
166
222
  error: 'Runtime local storage claim contract rejected.',
@@ -178,6 +234,11 @@ export const runtimeLocalStorageClaimContract = Object.freeze({
178
234
  maximumSegmentLength: 255,
179
235
  /** The longest SMB share name. */
180
236
  maximumShareLength: 80,
237
+ /**
238
+ * The most claim summaries one `getRuntimeLocalStorageClaims` page carries. A page of summaries
239
+ * with every field at its bound stays inside the network contract's one-mebibyte capture.
240
+ */
241
+ maximumSummaryPageSize: 200,
181
242
  } as const);
182
243
 
183
244
  const fail = (): never => { throw new Error(runtimeLocalStorageClaimContract.error); };
@@ -241,6 +302,14 @@ const shareOf = (valueArg: unknown): string => {
241
302
  return valueArg;
242
303
  };
243
304
 
305
+ /** The states a node may answer about one generation, whatever the answer's status. */
306
+ const isClaimStateOf = (
307
+ claimArg: Pick<IRuntimeLocalStorageClaim, 'lifecycle' | 'initialization'>, stateArg: TRuntimeLocalStorageClaimState,
308
+ ): boolean => claimArg.lifecycle === 'purge'
309
+ ? stateArg === 'purged' || stateArg === 'uncertain'
310
+ : stateArg === 'ready' || stateArg === 'uncertain'
311
+ || (stateArg === 'import-required' && claimArg.initialization === 'import');
312
+
244
313
  const literalOf = <TLiteral extends string>(valueArg: unknown, allowedArg: readonly TLiteral[]): TLiteral => {
245
314
  requireNetwork((allowedArg as readonly unknown[]).includes(valueArg));
246
315
  return valueArg as TLiteral;
@@ -424,11 +493,107 @@ export const bindApplyRuntimeLocalStorageClaimResponse = (
424
493
  const response = snapshotApplyRuntimeLocalStorageClaimResponse(valueArg);
425
494
  const { claim } = snapshotApplyRuntimeLocalStorageClaimRequest(requestArg);
426
495
  requireNetwork(networkEqual(response.claim, getRuntimeLocalStorageClaimReference(claim)));
427
- if (response.status !== 'historical') {
428
- requireNetwork(claim.lifecycle === 'purge'
429
- ? response.state === 'purged' || response.state === 'uncertain'
430
- : response.state === 'ready' || response.state === 'uncertain'
431
- || (response.state === 'import-required' && claim.initialization === 'import'));
432
- }
496
+ if (response.status !== 'historical') requireNetwork(isClaimStateOf(claim, response.state));
497
+ return response;
498
+ });
499
+
500
+ const sourceKinds = ['directory', 'nfs', 'smb'] as const;
501
+ const initializations = ['empty', 'import'] as const;
502
+ const lifecycles = ['bound', 'purge'] as const;
503
+
504
+ /** Detached exact-schema snapshot of one summary, its state judged against its lifecycle. */
505
+ export const snapshotRuntimeLocalStorageClaimSummary = (
506
+ valueArg: unknown,
507
+ ): IRuntimeLocalStorageClaimSummary => safe(() => {
508
+ const value = networkRecord(captureNetwork(valueArg), ['claimId', 'generation', 'clusterId', 'nodeId',
509
+ 'serviceId', 'volumeId', 'mountPath', 'sourceKind', 'initialization', 'lifecycle', 'state']);
510
+ const summary: IRuntimeLocalStorageClaimSummary = {
511
+ claimId: networkId(value.claimId),
512
+ generation: networkCounter(value.generation),
513
+ clusterId: networkId(value.clusterId),
514
+ nodeId: networkNodeId(value.nodeId),
515
+ serviceId: networkId(value.serviceId),
516
+ volumeId: networkId(value.volumeId),
517
+ mountPath: readMountPath(value.mountPath, 'mountPath'),
518
+ sourceKind: literalOf(value.sourceKind, sourceKinds),
519
+ initialization: literalOf(value.initialization, initializations),
520
+ lifecycle: literalOf(value.lifecycle, lifecycles),
521
+ state: value.state === null ? null : literalOf(value.state, claimStates),
522
+ };
523
+ // A purge always follows a bound generation, and an SMB volume always starts empty.
524
+ requireNetwork((summary.lifecycle === 'bound' || summary.generation > 1)
525
+ && (summary.sourceKind !== 'smb' || summary.initialization === 'empty')
526
+ && (summary.state === null || isClaimStateOf(summary, summary.state)));
527
+ return summary;
528
+ });
529
+
530
+ /**
531
+ * The one projection of a claim and its node's last answer into a summary. `stateArg` is what the
532
+ * node answered about exactly this generation, or `null` while it has not acknowledged it.
533
+ */
534
+ export const summarizeRuntimeLocalStorageClaim = (
535
+ claimArg: unknown, stateArg: TRuntimeLocalStorageClaimState | null,
536
+ ): IRuntimeLocalStorageClaimSummary => {
537
+ const claim = snapshotRuntimeLocalStorageClaim(claimArg);
538
+ return snapshotRuntimeLocalStorageClaimSummary({
539
+ claimId: claim.id,
540
+ generation: claim.generation,
541
+ clusterId: claim.clusterId,
542
+ nodeId: claim.nodeId,
543
+ serviceId: claim.serviceId,
544
+ volumeId: claim.volumeId,
545
+ mountPath: claim.mount.mountPath,
546
+ sourceKind: claim.source.kind,
547
+ initialization: claim.initialization,
548
+ lifecycle: claim.lifecycle,
549
+ state: stateArg,
550
+ });
551
+ };
552
+
553
+ /**
554
+ * Detached exact-schema snapshot of a read request. It checks the identity's shape only: the
555
+ * controller authenticates it.
556
+ */
557
+ export const snapshotGetRuntimeLocalStorageClaimsRequest = (
558
+ valueArg: unknown,
559
+ ): IGetRuntimeLocalStorageClaimsRequest => safe(() => {
560
+ const value = networkRecord(captureNetwork(valueArg), ['identity', 'clusterId'], ['nodeId', 'cursor', 'limit']);
561
+ const identity = networkRecord(value.identity, ['jwt']);
562
+ requireNetwork(typeof identity.jwt === 'string' && identity.jwt.length > 0);
563
+ return {
564
+ identity: { jwt: identity.jwt as string },
565
+ clusterId: networkId(value.clusterId),
566
+ ...(Object.hasOwn(value, 'nodeId') ? { nodeId: networkNodeId(value.nodeId) } : {}),
567
+ ...(Object.hasOwn(value, 'cursor') ? { cursor: networkId(value.cursor) } : {}),
568
+ ...(Object.hasOwn(value, 'limit')
569
+ ? { limit: networkCounter(value.limit, runtimeLocalStorageClaimContract.maximumSummaryPageSize) } : {}),
570
+ };
571
+ });
572
+
573
+ /** Detached exact-schema snapshot of one page: bounded, strictly ascending and never empty with a cursor. */
574
+ export const snapshotGetRuntimeLocalStorageClaimsResponse = (
575
+ valueArg: unknown,
576
+ ): IGetRuntimeLocalStorageClaimsResponse => safe(() => {
577
+ const value = networkRecord(captureNetwork(valueArg), ['claims'], ['nextCursor']);
578
+ const claims = networkList(value.claims, runtimeLocalStorageClaimContract.maximumSummaryPageSize,
579
+ snapshotRuntimeLocalStorageClaimSummary);
580
+ networkSorted(claims, (claimArg) => claimArg.claimId);
581
+ if (!Object.hasOwn(value, 'nextCursor')) return { claims };
582
+ requireNetwork(claims.length > 0);
583
+ return { claims, nextCursor: networkId(value.nextCursor) };
584
+ });
585
+
586
+ /**
587
+ * Matches a page to the read that asked for it: every summary names the requested cluster and, when
588
+ * the request named one, the requested node, and the page holds no more than the requested `limit`.
589
+ */
590
+ export const bindGetRuntimeLocalStorageClaimsResponse = (
591
+ valueArg: unknown, requestArg: unknown,
592
+ ): IGetRuntimeLocalStorageClaimsResponse => safe(() => {
593
+ const response = snapshotGetRuntimeLocalStorageClaimsResponse(valueArg);
594
+ const request = snapshotGetRuntimeLocalStorageClaimsRequest(requestArg);
595
+ requireNetwork(response.claims.length <= (request.limit ?? runtimeLocalStorageClaimContract.maximumSummaryPageSize)
596
+ && response.claims.every((claimArg) => claimArg.clusterId === request.clusterId
597
+ && (request.nodeId === undefined || claimArg.nodeId === request.nodeId)));
433
598
  return response;
434
599
  });
@@ -179,6 +179,22 @@ export interface IReq_Controller_Pallet_ApplyRuntimeLocalStorageClaim extends pl
179
179
  response: localStorage.IApplyRuntimeLocalStorageClaimResponse;
180
180
  }
181
181
 
182
+ /**
183
+ * An administrator reads the local storage claims Cloudly issued in one cluster, optionally on one
184
+ * node, one page at a time: each claim's id, volume, mount path, initialization, lifecycle and what
185
+ * its node last answered. `snapshotGetRuntimeLocalStorageClaimsRequest` and
186
+ * `bindGetRuntimeLocalStorageClaimsResponse` judge both sides; a summary never carries the claim's
187
+ * source beyond its kind, so no credential reference leaves Cloudly through it.
188
+ */
189
+ export interface IReq_Any_Cloudly_GetRuntimeLocalStorageClaims extends plugins.typedrequestInterfaces.implementsTR<
190
+ plugins.typedrequestInterfaces.ITypedRequest,
191
+ IReq_Any_Cloudly_GetRuntimeLocalStorageClaims
192
+ > {
193
+ method: 'getRuntimeLocalStorageClaims';
194
+ request: localStorage.IGetRuntimeLocalStorageClaimsRequest;
195
+ response: localStorage.IGetRuntimeLocalStorageClaimsResponse;
196
+ }
197
+
182
198
  /** Current-peer report, including exact historical outbox recovery after reconnect. */
183
199
  export interface IReq_Pallet_Controller_ReportRuntimeAssignmentObservation extends plugins.typedrequestInterfaces.implementsTR<
184
200
  plugins.typedrequestInterfaces.ITypedRequest,